背景介紹

隨著IPv4地址的短缺,為了讓多個網域名稱複用一個IP地址,在HTTP伺服器上引入了虛擬機器主機的概念。伺服器可以根據用戶端請求中不同的Host,將請求分配給不同的網域名稱(虛擬機器主機)來處理。在一個被多個網域名稱(虛擬機器主機)共用IP的HTTPS伺服器中,當瀏覽器訪問一個HTTPS網站時,會首先與伺服器建立SSL串連。建立SSL串連的第一步是請求伺服器的認證。伺服器在發送認證時,不知道瀏覽器訪問的是哪個網域名稱,所以不能根據不同網域名稱發送不同的認證。

SNI(Server Name Indication)是為瞭解決一個伺服器使用多個網域名稱和認證的SSL/TLS擴充。它的工作原理是:在串連到伺服器建立SSL串連之前,先發送要訪問網站的網域名稱(Hostname),這樣伺服器會根據這個網域名稱返回一個合適的認證。

目前,大多數作業系統和瀏覽器都已經很好地支援SNI擴充。OpenSSL 0.9.8 已經內建這一功能,新版的Nginx也支援SNI。

問題描述

在接入Web Application Firewall後,如果您出現HTTPS訪問異常問題,可能是由於用戶端不支援SNI導致的。

當使用不支援SNI的瀏覽器訪問Web Application Firewall的網站時,Web Application Firewall因不知道用戶端請求的是哪個網域名稱,無法調取對應的虛擬機器主機認證來跟用戶端互動,只能使用內建的一個預設認證去跟用戶端握手,這時在用戶端瀏覽器上會提示“伺服器憑證不可信”。

如果用戶端不支援SNI,可能會出現如下現象:

  • 在手機App用戶端,iOS用戶端可以正常訪問,而Android用戶端無法正常開啟。
  • 瀏覽器開啟網站,顯示認證不可信。

解決方案

您可以在用戶端抓SSL握手的報文,來判斷用戶端是否支援SNI。以Chrome瀏覽器訪問阿里雲官網為例。

若在Client Hello報文裡可以看到SNI擴充,則表示用戶端支援SNI擴充。

否則,用戶端不支援SNI擴充。對於不支援SNI的用戶端,

  • 建議您升級或使用新版本的瀏覽器(如Chrome、Firefox等)。
  • 如果是微信、支付寶第三方回調,需要讓其調用來源站點IP,繞過Web Application Firewall。

SNI相容性

说明 SNI相容TLS1.0及以上協議,但不被SSL支援。
  • SNI支援以下案頭版瀏覽器
    • 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及以上版本,Mac OS X 10.5.6 及以上版本
  • SNI支援以下
    • GNU TLS
    • Java 7及以上版本,僅作為用戶端
    • HTTP client 4.3.2及以上版本
    • libcurl 7.18.1及以上版本
    • NSS 3.1.1及以上版本
    • OpenSSL 0.9.8j及以上版本
    • OpenSSL 0.9.8f及以上版本,需配置flag
    • Qt 4.8及以上版本
  • SNI支援以下手機端瀏覽器
    • Android Browser on 3.0 Honeycomb及以上版本
    • iOS Safari on iOS 4及以上版本
    • Windows Phone 7及以上版本
  • SNI支援以下伺服器
    • Apache 2.2.12及以上版本
    • Apache Traffic Server 3.2.0及以上版本
    • HAProxy 1.5及以上版本
    • IIS 8.0及以上版本
    • lighttpd 1.4.24及以上版本
    • LiteSpeed 4.1及以上版本
    • nginx 0.5.32及以上版本
  • SNI 支援以下命令列
    • cURL 7.18.1及以上版本
    • wget 1.14及以上版本