SNI: 如何讓虛擬主機上多個網域名稱使用單一IP安裝SSL/TLS憑證
何謂SNI(Server Name Indication)技術?
從字面來解釋,SNI意思為「伺服器名稱指示」
FC 4366,是一項定義用於改善 SSL/TLS 的技術,在 SSLv3/TLSv1 中被啓用。允許客戶端在發起 SSL 握手請求時(具體說來,是客戶端發出 SSL 請求中的 ClientHello 階段),就送出請求的 Host 信息,使伺服器能夠切換到正確的域名並返回相應的證書。
要使用 SNI,需要用戶端和伺服器端同時滿足條件,幸好對於現代瀏覽器來說,大部分都支持 SSLv3/TLSv1,所以都可以享受 SNI 帶來的便利。
為什麼以前的SSL憑證無法多個域名使用同一組IP ?
早期的 SSLv2 根據經典的公鑰基礎設施 PKI(Public Key Infrastructure) 設計,它預設值為:一台伺服器(或者說一個IP)只會提供一個服務,所以在 SSL 握手時,伺服器端可以確認客戶端申請的是哪張證書。
但是讓人萬萬沒有想到的是,虛擬主機快速的蓬勃發展 ,就造成了一個 IP 會對應多個域名的情況。解決辦法有一些,例如申請泛域名證書,對所有 *.yourdomainname.com 的網域名稱都可以認證,但如果你還有一個 yourdomainname.net 的域名,那就不行了。
SNI技術中,在 HTTP 協議中,請求的網域名稱作為表頭(Host)放在 HTTP Header 中,所以伺服器端知道應該把請求引向哪個網域名稱,但是早期的 SSL 做不到這一點,因為在 SSL 握手的過程中,根本不會有 Host 的信息,所以伺服器端通常返回的是配置中的第一個可用憑證。因而一些較老的環境,可能會產生多個網域名稱分別配好了憑證後,但返回的始終是同一個。
SNI並非可以適用於所有的狀況,還是有條件限制的,若要知道你目前使用的憑證是否可以使用SNI技術,需要從用戶端及伺服器端兩個部分來看,相對的伺服器端比較容易解決,如果是用戶端就難一點,當然你可以在網站上告訴用戶,請用戶升級他們的瀏覽器版本。
支援SNI的瀏覽器:
- Internet Explorer 7 及更高版本(Windows Vista 及更高版本操作系統上的),Windows XP 的 Internet Explorer 全部不支援,即使是 Internet Explorer 8。
- Mozilla Firefox 2.0 及更高版本
- Opera 8.0 及更高版本 (必須開啓 TLS 1.1 協議)
- Opera Mobile 至少是 10.1 beta 的 Android 版本
- Google Chrome (Vista 或更高版本;XP 上的話要求 Chrome 6 及更高版本;OS X 10.5.7 及更高版本要求 Chrome 5.0.342.1 及更高版本)
- Safari 2.1 及更高版本 (Mac OS X 10.5.6 及更高版本或 Windows Vista 及更高版本)
- Konqueror/KDE 4.7 及更高版本
- MobileSafari (在 Apple iOS 4.0 及更高版本的環境下的)
- Android 預設瀏覽器 (在 Honeycomb 及更高版本的)
- Windows Phone 7 MicroB (在 Maemo 下的)
支援SNI的伺服器:
- Apache 2.2.12 及更高版本 使用 mod_ssl (或用試驗性的 mod_gnutls 代替)
- 上了patch的 lighttpd 1.4.x 或 1.5.x ,1.4.24+ 沒上patch就行
- Nginx 在以 SNI 為支持的 OpenSSL 的陪同下
- LiteSpeed 4.1 及更高版本
- Pound 2.6 及更高版本
- Apache Tomcat (Java 7) 及更高版本
- Microsoft Internet Information Server (IIS) 8