Cloudflare:什么是SNI(服務(wù)器名稱指示)?

來源: Cloudflare
作者:Cloudflare
時(shí)間:2021-03-17
18211
SNI有點(diǎn)像郵寄包裹到公寓樓而不是獨(dú)棟房子。將郵件郵寄到某人的獨(dú)棟房子時(shí),僅街道地址就足以將包裹發(fā)送給收件人。但是,當(dāng)包裹進(jìn)入公寓樓時(shí),除了街道地址外,還需要公寓號(hào)碼。否則,包裹可能無法送達(dá)收件人或根本無法交付。

Hippopx (6).jpg

什么是SNI(服務(wù)器名稱指示)?

SNI有點(diǎn)像郵寄包裹到公寓樓而不是獨(dú)棟房子。將郵件郵寄到某人的獨(dú)棟房子時(shí),僅街道地址就足以將包裹發(fā)送給收件人。但是,當(dāng)包裹進(jìn)入公寓樓時(shí),除了街道地址外,還需要公寓號(hào)碼。否則,包裹可能無法送達(dá)收件人或根本無法交付。

許多Web服務(wù)器更像是公寓大樓而不是獨(dú)棟房子:它們承載多個(gè)域名,因此僅IP地址不足以指示用戶嘗試訪問哪個(gè)域。這可能會(huì)導(dǎo)致服務(wù)器顯示錯(cuò)誤的SSL證書 ,從而阻止或終止HTTPS連接–就像如果沒有正確的收件人簽名,包裹將無法送到指定的地址一樣。

當(dāng)多個(gè)網(wǎng)站托管在一臺(tái)服務(wù)器上并共享一個(gè)IP地址,并且每個(gè)網(wǎng)站都有自己的SSL證書,在客戶端設(shè)備嘗試安全地連接到其中一個(gè)網(wǎng)站時(shí),服務(wù)器可能不知道顯示哪個(gè)SSL證書。這是因?yàn)镾SL/TLS握手發(fā)生在客戶端設(shè)備通過HTTP指示連接到某個(gè)網(wǎng)站之前。

服務(wù)器名稱指示(SNI)旨在解決此問題。 SNI是TLS協(xié)議(以前稱為SSL協(xié)議)的擴(kuò)展,該協(xié)議在HTTPS中使用。它包含在TLS/SSL握手流程中,以確保客戶端設(shè)備能夠看到他們嘗試訪問的網(wǎng)站的正確SSL證書。該擴(kuò)展使得可以在TLS握手期間指定網(wǎng)站的主機(jī)名或域名 ,而不是在握手之后打開HTTP連接時(shí)指定。

簡而言之,即使網(wǎng)站https://www.example.com托管在與https://www.something.com、https://www.another-website.com和https://www.example.io 相同的地方(相同的IP地址),SNI也能讓用戶的設(shè)備與https://www.example.com建立安全的連接。

SNI可以防止所謂的"公共名稱不匹配錯(cuò)誤" :即客戶端(用戶)設(shè)備到達(dá)網(wǎng)站的正確 IP地址 ,但SSL證書上的名稱與網(wǎng)站名稱不匹配。通常,這種錯(cuò)誤會(huì)導(dǎo)致用戶瀏覽器中出現(xiàn)"您的連接缺乏隱私性"的錯(cuò)誤消息。

SNI在2003年被添加為TLS/SSL的擴(kuò)展;它最初不是協(xié)議的一部分。幾乎所有的瀏覽器、操作系統(tǒng)和Web服務(wù)器都支持它,除了一些仍在使用的最舊的瀏覽器和操作系統(tǒng)。

服務(wù)器名稱是什么?

盡管SNI代表服務(wù)器名稱指示,但SNI實(shí)際上"表示"的是網(wǎng)站的主機(jī)名或域名,可以與實(shí)際托管該域的Web服務(wù)器的名稱分開。事實(shí)上,將多個(gè)域托管在同一臺(tái)服務(wù)器上很常見–在這種情況下,它們被稱為虛擬主機(jī)名。

服務(wù)器名稱就是計(jì)算機(jī)的名稱。對(duì)于Web服務(wù)器,此名稱通常對(duì)最終用戶不可見,除非該服務(wù)器僅托管一個(gè)域并且該服務(wù)器名稱與該域名等同。

TLS的SNI擴(kuò)展有什么作用?

Web服務(wù)器通常負(fù)責(zé)多個(gè)主機(jī)名–或域名(網(wǎng)站的人類可讀名稱)。如果網(wǎng)站使用HTTPS 則每個(gè)主機(jī)名將具有其自己的SSL證書。

問題是,一臺(tái)服務(wù)器上的所有這些主機(jī)名都位于同一IP地址。這在HTTP上不是問題,因?yàn)橐坏┐蜷_TCP連接,客戶端就會(huì)在HTTP請(qǐng)求中指明他們嘗試訪問的網(wǎng)站。

但是在HTTPS中,先有TLS握手,然后才能開始HTTP對(duì)話(HTTPS仍使用HTTP –它只是對(duì)HTTP消息進(jìn)行加密)。如果沒有SNI,客戶端將無法向服務(wù)器指示正在與之通信的主機(jī)名。結(jié)果,服務(wù)器可能為錯(cuò)誤的主機(jī)名生成SSL證書。如果SSL證書上的名稱與客戶端嘗試訪問的名稱不匹配,則客戶端瀏覽器將返回錯(cuò)誤信息,并通常會(huì)終止連接。

SNI將域名添加到TLS握手過程,以便TLS程序到達(dá)正確的域名并接收正確的SSL證書,從而使其余TLS握手能夠正常進(jìn)行。

具體來說,SNI會(huì)在“Client Hello(客戶端問候)”消息或TLS握手的第一步就包含了主機(jī)名。

什么是主機(jī)名?什么是虛擬主機(jī)名?

主機(jī)名是連接到網(wǎng)絡(luò)的設(shè)備的名稱。在互聯(lián)網(wǎng)背景中,域名或網(wǎng)站名稱是一種主機(jī)名。兩者都與與域名關(guān)聯(lián)的IP地址分開。

虛擬主機(jī)名是沒有自己的IP地址的主機(jī)名,它與其他主機(jī)名一起托管在服務(wù)器上。它是"虛擬的" ,因?yàn)樗鼪]有專用的物理服務(wù)器,就像虛擬現(xiàn)實(shí)僅以數(shù)字形式存在,而不是在物理世界中一樣。

如果用戶的瀏覽器不支持SNI,會(huì)發(fā)生什么?

在這種罕見的情況下,用戶可能無法訪問某些網(wǎng)站,并且用戶的瀏覽器將返回錯(cuò)誤消息,例如"您的連接缺乏安全隱私。"

絕大多數(shù)瀏覽器和操作系統(tǒng)都支持SNI。僅非常舊版本的Internet Explorer、舊版的BlackBerry操作系統(tǒng)以及其他過時(shí)的軟件版本不支持SNI。

立即登錄,閱讀全文
版權(quán)說明:
本文內(nèi)容來自于Cloudflare,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個(gè)人觀點(diǎn),不代表快出海對(duì)觀點(diǎn)贊同或支持。如有侵權(quán),請(qǐng)聯(lián)系管理員(zzx@kchuhai.com)刪除!
優(yōu)質(zhì)服務(wù)商推薦
更多
掃碼登錄
打開掃一掃, 關(guān)注公眾號(hào)后即可登錄/注冊(cè)
加載中
二維碼已失效 請(qǐng)重試
刷新
賬號(hào)登錄/注冊(cè)
小程序
快出海小程序
公眾號(hào)
快出海公眾號(hào)
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家