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

何謂SNI(Server Name Indication)技術?

是一項定義用於改善 SSL/TLS 的技術,在 SSLv3/TLSv1 中被啓用。允許客戶端在發起 SSL 握手請求時,就送出請求的 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


Was this article helpful?

mood_bad Dislike 0
mood Like 0
visibility Views: 1344