什么是SNI(服務器名稱指示)?
SNI有點像郵寄包裹到公寓樓而不是獨棟房子。將郵件郵寄到某人的獨棟房子時,僅街道地址就足以將包裹發(fā)送給收件人。但是,當包裹進入公寓樓時,除了街道地址外,還需要公寓號碼。否則,包裹可能無法送達收件人或根本無法交付。
許多Web服務器更像是公寓大樓而不是獨棟房子:它們承載多個域名,因此僅IP地址不足以指示用戶嘗試訪問哪個域。這可能會導致服務器顯示錯誤的SSL證書 ,從而阻止或終止HTTPS連接–就像如果沒有正確的收件人簽名,包裹將無法送到指定的地址一樣。
當多個網(wǎng)站托管在一臺服務器上并共享一個IP地址,并且每個網(wǎng)站都有自己的SSL證書,在客戶端設備嘗試安全地連接到其中一個網(wǎng)站時,服務器可能不知道顯示哪個SSL證書。這是因為SSL/TLS握手發(fā)生在客戶端設備通過HTTP指示連接到某個網(wǎng)站之前。
服務器名稱指示(SNI)旨在解決此問題。 SNI是TLS協(xié)議(以前稱為SSL協(xié)議)的擴展,該協(xié)議在HTTPS中使用。它包含在TLS/SSL握手流程中,以確??蛻舳嗽O備能夠看到他們嘗試訪問的網(wǎng)站的正確SSL證書。該擴展使得可以在TLS握手期間指定網(wǎng)站的主機名或域名 ,而不是在握手之后打開HTTP連接時指定。
簡而言之,即使網(wǎng)站https://www.example.com托管在與https://www.something.com、https://www.another-website.com和https://www.example.io 相同的地方(相同的IP地址),SNI也能讓用戶的設備與https://www.example.com建立安全的連接。
SNI可以防止所謂的"公共名稱不匹配錯誤" :即客戶端(用戶)設備到達網(wǎng)站的正確 IP地址 ,但SSL證書上的名稱與網(wǎng)站名稱不匹配。通常,這種錯誤會導致用戶瀏覽器中出現(xiàn)"您的連接缺乏隱私性"的錯誤消息。
SNI在2003年被添加為TLS/SSL的擴展;它最初不是協(xié)議的一部分。幾乎所有的瀏覽器、操作系統(tǒng)和Web服務器都支持它,除了一些仍在使用的最舊的瀏覽器和操作系統(tǒng)。
服務器名稱是什么?
盡管SNI代表服務器名稱指示,但SNI實際上"表示"的是網(wǎng)站的主機名或域名,可以與實際托管該域的Web服務器的名稱分開。事實上,將多個域托管在同一臺服務器上很常見–在這種情況下,它們被稱為虛擬主機名。
服務器名稱就是計算機的名稱。對于Web服務器,此名稱通常對最終用戶不可見,除非該服務器僅托管一個域并且該服務器名稱與該域名等同。
TLS的SNI擴展有什么作用?
Web服務器通常負責多個主機名–或域名(網(wǎng)站的人類可讀名稱)。如果網(wǎng)站使用HTTPS 則每個主機名將具有其自己的SSL證書。
問題是,一臺服務器上的所有這些主機名都位于同一IP地址。這在HTTP上不是問題,因為一旦打開TCP連接,客戶端就會在HTTP請求中指明他們嘗試訪問的網(wǎng)站。
但是在HTTPS中,先有TLS握手,然后才能開始HTTP對話(HTTPS仍使用HTTP –它只是對HTTP消息進行加密)。如果沒有SNI,客戶端將無法向服務器指示正在與之通信的主機名。結果,服務器可能為錯誤的主機名生成SSL證書。如果SSL證書上的名稱與客戶端嘗試訪問的名稱不匹配,則客戶端瀏覽器將返回錯誤信息,并通常會終止連接。
SNI將域名添加到TLS握手過程,以便TLS程序到達正確的域名并接收正確的SSL證書,從而使其余TLS握手能夠正常進行。
具體來說,SNI會在“Client Hello(客戶端問候)”消息或TLS握手的第一步就包含了主機名。
什么是主機名?什么是虛擬主機名?
主機名是連接到網(wǎng)絡的設備的名稱。在互聯(lián)網(wǎng)背景中,域名或網(wǎng)站名稱是一種主機名。兩者都與與域名關聯(lián)的IP地址分開。
虛擬主機名是沒有自己的IP地址的主機名,它與其他主機名一起托管在服務器上。它是"虛擬的" ,因為它沒有專用的物理服務器,就像虛擬現(xiàn)實僅以數(shù)字形式存在,而不是在物理世界中一樣。
如果用戶的瀏覽器不支持SNI,會發(fā)生什么?
在這種罕見的情況下,用戶可能無法訪問某些網(wǎng)站,并且用戶的瀏覽器將返回錯誤消息,例如"您的連接缺乏安全隱私。"
絕大多數(shù)瀏覽器和操作系統(tǒng)都支持SNI。僅非常舊版本的Internet Explorer、舊版的BlackBerry操作系統(tǒng)以及其他過時的軟件版本不支持SNI。