閱讀578 返回首頁    go 阿裏雲


接入後HTTPS異常(SNI問題)__排錯手冊_Web 應用防火牆-阿裏雲

概述

當發現接入Web應用防火牆後,如果出現HTTPS訪問異常,可能是由於客戶端不支持SNI導致的

問題現象

如果客戶端不支持sni,可能會導致如下現象:

1.手機APP客戶端,ios客戶端可以正常訪問,而Android客戶端無法正常打開

2.瀏覽器打開網站,顯示證書不可信

問題原因:

隨著IPv4地址的短缺,為了讓多個域名複用一個IP地址,在HTTP服務器上引入了虛擬主機的概念,服務器可以根據客戶端請求中不同的host來將請求交給不同的域名(虛擬主機)來處理。

但在一個被多個域名(虛擬主機)共享IP的HTTPS服務器中,瀏覽器在訪問一個HTTPS站點時,先與服務器建立SSL連接,建立連接的第一步就是請求服務器的證書。而服務器在發送證書的時候,是不知道瀏覽器訪問的是哪個域名的,所以不能根據不同域名發送不同的證書。

SNI(Server Name Indication)是為了解決一個服務器使用多個域名和證書的SSL/TLS擴展。一句話簡述它的工作原理就是,在連接到服務器建立SSL鏈接之前先發送要訪問站點的域名(Hostname),這樣服務器根據這個域名返回一個合適的證書。目前,大多數操作係統和瀏覽器都已經很好地支持SNI擴展,OpenSSL 0.9.8已經內置這一功能,新版的nginx也支持SNI。

當使用不支持SNI的瀏覽器訪問Web應用防火牆的網站時,Web應用防火牆因不知道客戶端請求的是哪個域名,無法調取對應的虛擬主機證書來跟客戶端交互,隻能使用內置的一個缺省證書去跟客戶端握手,這時在客戶端瀏覽器上會提示“服務器證書不可信”,如下圖:

 

 Nginx/Apache的服務器端SNI實現

 

, 如需要配置服務器支持,SNI,,可參考這兩篇文章:

,Nginx,:,https://www.ttlsa.com/web/multiple-https-host-nginx-with-a-ip-configuration/

,Apache,:,https://www.ttlsa.com/apache/multi-https-virtual-host-apache-mod_gnutls/

 

客戶端不支持SNI如何解決

 

, SNI,是一個很便利的擴展,隨著,IPv4,地址的耗盡,全麵支持,SNI,是趨勢。對於不支持,SNI,的客戶端,我們有兩個解決方案:

,1.,  ,建議用戶升級或使用新版本的瀏覽器,如,Chrome,、,Firefox,等(強烈推薦)

,2.,  ,如果是微信、支付寶第三方回調。需要讓其調用源站IP,繞過Web應用防火牆

 

 常見的SNI支持情況

 

注意: SNI兼容TLS1.0及以上的協議,但不被SSL支持。

,桌麵版瀏覽器支持

  • ,Chrome 5,及以上版本
  • ,Chrome 6,及以上版本(,Windows XP,)
  • ,Firefox 2,及以上版本
  • ,IE 7,及以上版本(運行在,Windows Vista/Server 2008,及以上版本版本係統中,,在,XP,係統中任何版本的,IE,瀏覽器都不支持,SNI,)
  • ,Konqueror 4.7 ,及以上版本
  • ,Opera 8 ,及以上版本
  • ,Safari 3.0 on Windows Vista/Server 2008 ,及以上版本,, or Mac OS X 10.5.6 ,及以上版本

 

,手機端瀏覽器支持

  • ,Android Browser on 3.0 Honeycomb ,及以上版本
  • ,iOS Safari on iOS 4 ,及以上版本
  • ,Windows Phone 7 ,及以上版本

 

,服務器支持

  • , Apache 2.2.12 ,及以上版本
  • ,Apache Traffic Server 3.2.0 ,及以上版本
  • ,Cherokee
  • ,HAProxy 1.5 ,及以上版本
  • ,IIS 8.0 ,及以上版本
  • ,lighttpd 1.4.24 ,及以上版本
  • ,LiteSpeed 4.1 ,及以上版本
  • ,nginx 0.5.32 ,及以上版本

 

,命令行支持

  • ,cURL 7.18.1 ,及以上版本
  • ,wget 1.14 ,及以上版本

 

,庫支持

  • , GNU TLS
  • ,JSSE (Oracle Java) 7 ,及以上版本,, ,僅作為客戶端
  • ,libcurl 7.18.1 ,及以上版本
  • ,NSS 3.1.1 ,及以上版本
  • ,OpenSSL 0.9.8j ,及以上版本
  • ,OpenSSL 0.9.8f ,及以上版本,需配置,flag
  • ,Qt 4.8 ,及以上版本

 

如何判斷自己的客戶端是否支持SNI?

訪問https://sni.velox.ch/, 如果使用的客戶端(如瀏覽器)支持SNI,會提示下圖:

SNI_supported

如果不支持SNI,則會提示證書不可信,繼續訪問後提示下圖:

SNI_not_supported

最後更新:2016-12-01 20:05:28

  上一篇:go 登陸狀態丟失問題__排錯手冊_Web 應用防火牆-阿裏雲
  下一篇:go 接入狀態檢測異常__排錯手冊_Web 應用防火牆-阿裏雲