Server Name Indication(SNI)

轉載自: http://openwares.net/misc/server_name_indication.htmlhtml

 

Server Name Indication是用來改善SSL(Secure Socket Layer)和TLS(Transport Layer Security)的一項特性。它容許客戶端在服務器端向其發送證書以前請求服務器的域名。這對於在虛擬主機模式使用TLS是必要的。nginx

TLS背景web

加密一個面向流的通信會話最經常使用的方法之一就是使用TLS協議。好比,當用戶在瀏覽器的地址欄裏面輸入https時就是在使用這個協議。windows

爲了確認用戶想要鏈接的站點就是瀏覽器實際鏈接到的站點,TLS使用包含站點域名的數字簽名證書。客戶端軟件(好比瀏覽器)一般信任這個證書,若是這個證書是由其內置信任的認證機構簽發的。
在TLS啓動階段,客戶端軟件比較用戶輸入的URI的域名部分與在服務器證書裏面找到的域名部分,若是比較失敗,瀏覽器會提示用戶,這個站點的證書存在問題。

缺點後端

SSL v2的設計順應經典的公鑰基礎設施PKI(public key infrastructure)設計,後者認爲一個服務器只提供一個服務從而也就只使用一個證書。這意味着服務器能夠在TLS啓動的早期階段發送或提交證書,由於它知道它在爲哪一個域服務。瀏覽器

HTTP服務器開啓虛擬主機支持後,每一個服務器經過相同的地址能夠爲不少域提供服務。服務器檢查每個請求來決定它在爲哪一個域服務。這個信息一般從HTTP請求頭得到。不幸的是,當設置了TLS加密,服務器在讀取HTTP請求裏面的域名以前已經向客戶端提交了證書,也就是已經爲默認域提供了服務。tomcat

所以,這種爲虛擬主機提供安全的簡單途徑常常致使使用了錯誤的數字證書,從而致使瀏覽器對用戶發出警告。安全

釣魚鏈接服務器

實際上,這意味着每個HTTP服務器只能爲一個域提供安全瀏覽。而事實上每個web服務器都爲不少域提供服務,結果就是其餘的域沒法使用安全通訊,從而處於危險境地。此外,安全瀏覽的缺少使瀏覽器沒法認證服務器,亦即它沒法校驗站點是否真的是屬於宣稱它的那我的或實體。釣魚的一個重要因素是他們企圖經過虛假站點來獲取用戶的信息。使用SSL或者TLS安全鏈接,瀏覽器能夠基於它的證書來認證站點。釣魚站點不會做爲一個欺騙性的站點獲得認證,瀏覽器會警告這個安全風險。然而,沒有安全HTTP就沒有標準的方法去認證服務器,使這種釣魚的企圖很容易就能實現。app

修正

一個叫作SNI的TLS擴展經過發送虛擬域的名字作爲TSL協商的一部分修正了這個問題。這會使服務器更早的切換到正確的虛擬域,而且發送給瀏覽器包含正確名字的數字證書。

行動

在2005年,人們意識到從SSL v2到TLS沒有很容易的升級路徑,而且站點不得不升級他們的軟件來。爲了儘快的推動,Mozilla宣告徹底拋棄對SSL v2的支持。Firefox社區確信其他的站點會升級他們的服務器到SSL v3或TLS v1。

從2005年開始,CAcert在虛擬服務器上用不一樣的方法使用TLS來進行試驗,大部分試驗是不滿意而且不實際的。好比,可使用subjectAltName在一個數字證書中包含多個域,可是這是一個證書,意味着全部的域必須被一我的擁有並控制,而且每次域列表發生變化,證書必須從新發放。

2004年,EdelKey project爲OpenSSL裏面的TLS/SNI開發了一個補丁。2006年這個補丁進入OpenSSL的開發分支,2007年,它被向後移植到了OpenSSL 0.9.8,也就是當前的發行版本。

支持情況

支持SNI的瀏覽器

* Mozilla Firefox 2.0 or later
* Opera 8.0 or later (the TLS 1.1 protocol must be enabled)
* Internet Explorer 7 or later on Windows Vista or higher
* Google Chrome (Vista, not XP)
* Safari 3.2.1 Mac OS X 10.5.6

支持SNI的服務器

* Apache 2.2.12 or later using mod_ssl (or alternatively with experimental mod_gnutls)
* Cherokee if compiled with TLS support
* Versions of lighttpd 1.4.x and 1.5.x with patch
* Nginx with an accompanying OpenSSL built with SNI support
* acWEB with OpenSSL 0.9.8j and later (on Windows)

支持SNI的庫

* Mozilla NSS 3.11.1 client side only
* OpenSSL
0.9.8f (released 11 Oct 2007) – not compiled in by default, can be compiled in with config option ‘–enable-tlsext’.
0.9.8j (released 07 Jan 2009) – now compiled in by default
Unreleased 0.9.9 is likely to include SNI compiled in by default.
* GNU TLS

不支持SNI的操做系統,瀏覽器和庫

客戶端

* Internet Explorer 6 or earlier and any IE version on Windows XP , windows 2003 or earlier
* Konqueror/KDE in any version

服務器端

* Microsoft Internet Information Server IIS (As of 2009).
* Apache Tomcat 8 or earlier

* Qt
* Mozilla NSS server side
* Python

windows和IE

能夠看得出,windows XP和windows 2003 server系統上的任何IE版本瀏覽器都是不支持SNI的, vista及之後系統上的IE 7及更高版本的IE瀏覽器支持SNI。IE6及更早版本的IE瀏覽器在任何系統上都是不支持SNI的。

tomcat

tomcat當前的穩定版8尚不支持SNI,tomcat 9纔會支持,之後可能會backport到tomcat 8和7。可使用nginx反向https代理後端的tomcat,參見[2]

SNI測試

用瀏覽器或其餘https客戶端好比wget等訪問SNI測試站點https://sni.velox.ch/便可以知道瀏覽器或客戶端是否支持SNI。

References:
[1]Server Name Indication
[2]Setting up NGINX SSL reverse proxy for Tomcat
[3]HowTo setup Tomcat serving two SSL Certificates using SNI?

相關文章
相關標籤/搜索