【分享】什麼是TLS Server Name Indication (SNI)



贊助商連結


evoms
2011-09-04, 12:56 AM
(本文為筆者原創 非轉貼)

今天筆者要跟大家分享並介紹一點TLS的新應用,如果有誤請多多包涵,也歡迎朋友們一起討論。

相信大家都有聽過SSL(Secure Socket Layer),這是一種用於網路傳輸加密及可靠性的安全機制,SSL的版本到了v3之後,就已經被TLSv1給取代了,但由於市場知名度的緣故,大部分的朋友仍以SSL來統稱SSL以及TLS。

說到SSL,大家第一個想到的就是Web網站上的https通訊協定,通常在架設Aapache web server的時候,有時會多啟用一個安全的連接埠443來作為https專用。

然而,如果您對HTTP通訊協定稍有了解,就會發現這存在著一個很大的問題,標準的https採用的就是SSL Connect/Implicit SSL的連線方式,也就是連線建立之後,就立即進入SSL交涉階段,然後才由Browser端送出HTTP Request的封包,但是,很不幸的,這樣子的一個順序造成了一個很大的問題,也就是虛擬主機(Virtual Host)的運用。

HTTP Request內包含了有這次瀏覽器想要存取的網站主機的資訊,也就是host:的標頭,但是Apache伺服器卻是在已經建立SSL連線之後才能知道這個資訊,這造就的最大問題就是SSL憑證的問題。

所有的瀏覽器,目前都是透過SSL憑證當中的CN欄位或者是x509v3的擴充欄位dnsName來判斷這個憑證是否屬於目前要存取的網站,當多個網站共用同一個IP位址時,Apache伺服器根本無法得知瀏覽器這次要存取的網站是哪一個,更沒有辦法傳送正確的憑證給瀏覽器。

因此,為了因應這個問題,一些憑證的簽章商便發明了兩種產品來解決這樣的問題,一個是多CN的憑證,另一種是Wildcard SSL憑證。

不管是哪一種,都沒有辦法完全解決這個問題,因為如果你是網站代管商,你的客戶來來去去,怎麼可能時常針對憑證作增減的動作,這每一動都是要花大錢的。或者是所謂的Wildcard SSL憑證,一個主機代管的網站也不一定都是屬於同一個網域之下,這種憑證未必能有什麼用處。

因此,要架設專業的SSL網站,變成是非得利用專屬的獨立IP才有辦法做到的事情,但好景不常,大家都知道一件事情就是IPv4庫藏已經在2011年初宣布耗盡了。可想而知,未來獨立的IP位址將會愈來愈稀有,愈來愈難取得。

所幸,這個問題最終還是獲得解決了,一個新的TLS擴充交涉方式誕生了,那就是TLS Server Name Indication,它的運作原理是,當客戶端與伺服器端進行TLS協議交涉的時候,客戶端會多送出一個目前想要存取的伺服器網域的資訊,伺服器收到這個訊息之後,可以選擇重新送出相對應的SSL憑證。

朋友們對於TLS SNI可能還很陌生,也在擔心這樣的機制是否支援度夠廣?其實大家大可放心,目前最新的Apache搭配主流五大流覽器最新版,或者甚至是一些其他種類的伺服器,比如說郵件伺服器搭配Outlook或是Thunderbird都可以完全對應這樣子的機制。

結語:網路應用進化到今日,似乎TLS也終將變為標準的配備,當所有的使用者都能在不知不覺當中輕鬆的使用安全機制的時候,也就是不安全的通訊方式說再見的日子。