什麼是 SNI?TLS 伺服器名稱指示如何運作

SNI(伺服器名稱指示)是 TLS 加密通訊協定的新增功能,可讓用戶端裝置指定在 TLS 交握的第一個步驟中嘗試連線的網域名稱,以防止一般名稱不相符錯誤。

學習目標

閱讀本文後,您將能夠:

  • 說明什麼是虛擬主機名稱
  • 瞭解伺服器為什麼可能提供錯誤的 SSL 憑證
  • 瞭解 SNI 如何修正此問題

相關內容


想要繼續瞭解嗎?

訂閱 TheNET,這是 Cloudflare 每月對網際網路上最流行見解的總結!

請參閱 Cloudflare 的隱私權政策,了解我們如何收集和處理您的個人資料。

複製文章連結

什麼是 SNI(伺服器名稱指示)?

SNI 有點像郵寄包裹到公寓樓而不是獨棟房子。將物品郵寄到某人的獨棟房子時,僅街道地址就足以將包裹遞交給正確的人。但是,當包裹進入公寓樓時,除了街道位址外,還需要公寓號碼。否則,包裹可能無法送達收件人處或根本無法遞交。

許多 Web 伺服器更像是公寓大樓而不是獨棟房子:它們代管多個網域名稱,因此僅 IP 位址不足以表明使用者正在嘗試連線哪個網域。這可能會導致伺服器顯示錯誤的 SSL 憑證,從而阻止或終止 HTTPS 連線——就像如果沒有正確的收件人簽收,就無法將包裹送到指定的地址一樣。

如果多個網站託管在一台伺服器上並共用一個 IP 位址,且每個網站都有自己的 SSL 憑證,那麼當用戶端裝置嘗試安全地連接到其中一個網站時,伺服器可能不知道顯示哪個 SSL 憑證。因為在用戶端裝置透過 HTTP 表明連接到哪個網站之前,就會發生 SSL/TLS 交握。

伺服器名稱指示 (SNI) 就是為了解決這個問題而設計的。SNI 是 TLS 通訊協定(以前稱為 SSL 通訊協定)的延伸,用於 HTTPS。它包含在 TLS/SSL 交握過程中,以確保用戶端裝置能夠看到它們試圖存取的網站的正確 SSL 憑證。該延伸可以在 TLS 交握期間指定網站的主機名稱或網域名稱,而不是在交握後開啟 HTTP 連線時指定。

簡而言之,即使網站 https://www.example.com 託管在與 https://www.something.com、https://www.another-website.com 和 https://www.example.io 相同的地方(相同的 IP 位址),SNI 也能讓使用者的裝置與 https://www.example.com 建立安全的連線。

SNI 可防止所謂的「常見名稱不匹配錯誤」:即用戶端(使用者)裝置到達了網站的正確 IP 位址,但 SSL 憑證上的名稱與網站名稱不匹配。通常這種錯誤會導致使用者瀏覽器中出現「您的連線並非私人連線」錯誤訊息。

SNI 在 2003 年被新增為 TLS/SSL 的延伸;它最初不是通訊協定的一部分。幾乎所有的瀏覽器、作業系統和 Web 伺服器都支援它,但一些仍在使用的最舊的瀏覽器和作業系統除外。

註冊
使用 Cloudflare 的免費 SSL/TLS 提高安全性和信任

什麼是伺服器名稱?

儘管 SNI 代表伺服器名稱指示,但 SNI 實際上「指示」的是網站的主機名稱或網域名稱,它可以與實際代管網域的 Web 伺服器的名稱分開。事實上,多個網域託管在一台伺服器上是很常見的——在這種情況下,它們被稱為虛擬主機名稱。

伺服器名稱就是電腦的名稱。對於 Web 伺服器,此名稱通常對終端使用者不可見,除非伺服器僅代管一個網域並且伺服器名稱等同於網域名稱。

TLS 的 SNI 延伸有什麼作用?

一個 Web 伺服器通常負責多個主機名稱——或網域名稱(它們是網站的人類可讀名稱)。如果網站使用 HTTPS,則每個主機名稱都將擁有自己的 SSL 憑證。

問題是,一台伺服器上的所有這些主機名稱都在同一個 IP 位址上。這在 HTTP 上不是問題,因為一旦開啟 TCP 連線,用戶端就會在 HTTP 請求中表明他們試圖存取的網站。

但是在 HTTPS 中,先發生 TLS 交握,然後才能開始 HTTP 對話(HTTPS 仍使用 HTTP,它只是對 HTTP 訊息進行加密)。如果沒有SNI,用戶端將無法向伺服器表明想與之通訊的主機名稱。這樣一來,伺服器可能為錯誤的主機名稱產生 SSL 憑證。如果 SSL 憑證上的名稱與用戶端嘗試連線的名稱不匹配,則用戶端瀏覽器將傳回錯誤,且通常會終止連線。

SNI 會將網域名稱新增至 TLS 交握程序,以便 TLS 程序連線正確的網域名稱並接收正確的 SSL 憑證,從而使 TLS 交握的其餘部分能正常進行。

具體來說,SNI 在 Client Hello 訊息或 TLS 交握的第一個步驟中包含主機名稱。

白皮書
最大程度利用 TLS 的能力

什麼是主機名稱?什麼是虛擬主機名稱?

主機名稱是連線到網路的裝置名稱。在網際網路環境中,網域名稱或網站名稱是一種主機名稱。兩者都與和網域名稱相關聯的 IP 位址不同。

虛擬主機名稱沒有自己的 IP 位址,並與其他主機名稱一起託管在伺服器上。它是「虛擬」的,因為它沒有專用的實體伺服器,就像虛擬實境只是數位存在,而不是在實際世界中存在一樣。

什麼是加密 SNI (ESNI)?

加密 SNI (ESNI) 透過加密 Client Hello 的 SNI 部分來新增到 SNI 延伸。這可以防止任何在用戶端和伺服器之間窺探的人看到用戶端正在請求哪個憑證,從而進一步保護用戶端。Cloudflare 和 Mozilla Firefox 於 2018 年推出了對 ESNI 的支援。

如果使用者的瀏覽器不支援 SNI,會發生什麼?

在這種罕見的情況下,使用者可能無法存取某些網站,並且使用者的瀏覽器將傳回「您的連線並非私人連線」之類的錯誤訊息。

絕大多數瀏覽器和作業系統都支援 SNI。只有非常舊版本的 Internet Explorer、舊版本的 BlackBerry 作業系統和其他過時的軟體版本不支援 SNI。

要詳細瞭解 TLS/SSL 通訊協定、SSL 憑證以及 HTTPS 的工作原理,請參閱什麼是 SSL 憑證?,或從 Cloudflare 獲取免費的 SSL 憑證