什麼是SNI?
隨著IPv4地址的短缺,為了讓多個網域名稱複用一個IP,在HTTP伺服器上引入了虛擬機器主機的概念。伺服器可以根據用戶端請求中不同的host,將請求分發給不同的網域名稱(虛擬機器主機)來處理。
但是,在一個被多個網域名稱(虛擬機器主機)共用IP的HTTPS伺服器中,由於在握手建立之前伺服器無法知道用戶端請求的是哪個host,所以無法將請求交給特定的虛擬機器主機。然而,要完成握手,又必須讀取虛擬機器主機中配置的認證資訊。
Server name indication(簡稱,SNI)就是用來解決這個矛盾問題的。SNI要求用戶端在與伺服器握手時就攜帶需要訪問的網域名稱的host資訊。這樣,伺服器就知道需要用哪個虛擬機器主機的認證與用戶端握手並建立TLS串連。
SNI最早在2004年被提出,目前主流的瀏覽器、伺服器和測試載入器都已支援SNI。
為什麼使用DDoS高防和Web Application Firewall必須要求用戶端支援SNI?
DDoS高防和Web Application Firewall(WAF)在反向 ProxyHTTPS業務時,需要代理用戶端去和真實伺服器(RS)進行互動,所以需要在配置HTTPS防護時上傳認證和私密金鑰。真實的Anti-DDoS Pro和WAF伺服器的數量是有限的,面對數以萬計的網域名稱顯然無法實現一個網域名稱一台物理伺服器的配置,所以整個DDoS高防和WAF服務叢集必然存在多個網域名稱複用相同的伺服器。因此,用戶端必須支援 SNI,才能與DDoS高防和WAF進行正常互動。
如果使用不支援SNI的瀏覽器訪問DDoS高防或WAF服務防護的網站,DDoS高防或WAF因無法確認用戶端請求的是哪個網域名稱,無法調取對應的虛擬機器主機認證與用戶端互動,只能使用內建的預設認證與用戶端串連。在這種情況下,在用戶端瀏覽器上會出現“伺服器憑證不可信”的提示。
說明 即使真實伺服器只有一個網域名稱(沒有複用IP的情況),由於DDoS高防或WAF服務需要在中間進行反向 Proxy,而用戶端必須先與DDoS高防或WAF建立串連,所以用戶端依然需要支援SNI。
解決方案
伺服器端
配置您的伺服器,使其支援SNI。
用戶端
對於不支援SNI的用戶端,建議您採用以下解決方案:
- 建議您的使用者使用新版本的瀏覽器,例如Google Chrome、Firefox等。
- 不要在DDoS高防服務中配置七層網站防護,而只採用四層連接埠轉寄的方式配置網站防護。
說明 配置四層連接埠防護將無法防禦CC攻擊。
SNI相容性
說明 SNI相容TLS 1.1及以上版本的協議,但與SSL協議不相容。
- 支援的案頭版瀏覽器:
- Chrome 5及以上版本
- Chrome 6及以上版本
- Firefox 2及以上版本
- Internet Explorer 7及以上版本(僅支援Windows Vista、Windows Server 2008及以上版本作業系統。在 Windows XP系統中,任何版本的IE瀏覽器都不支援SNI。)
- Konqueror 4.7及以上版本
- Opera 8及以上版本
- Safari 3.0及以上版本(僅支援Windows Vista、Windows Server 2008及以上版本作業系統,或Mac OS X 10.5.6及以上版本作業系統。)
- 支援的手機端瀏覽器:
- Android 3.0 Honeycomb及以上版本
- 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及以上版本