SNI: 如何讓虛擬主機上多個網域名稱使用單一IP安裝SSL/TLS憑證

SNI_SSL

 

何謂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

You may also like...

發佈留言