伺服器名稱指示

伺服器名稱指示(英語:Server Name Indication,簡稱SNI)是一個擴展的TLS計算機聯網協定,在該協定下,在握手過程開始時客戶端告訴它正在連線的伺服器要連線的主機名稱。這允許伺服器在相同的IP位址和TCP連線埠號上呈現多個TLS證書,並且因此允許在相同的IP位址上提供多個安全(HTTPS)網站(或其他任何基於TLS的服務),而不需要所有這些站點使用相同的TLS證書。它與HTTP/1.1基於名稱的虛擬主機的概念相同,但是用於HTTPS。所需的主機名未加密, 因此竊聽者可以查看請求的網站。

基本介紹

  • 中文名:伺服器名稱指示
  • 外文名:Server Name Indication
簡介,問題的背景,SNI如何解決此問題,實現,安全性,域前置,加密伺服器名稱指示(ESNI),

簡介

伺服器名稱指示(英語:Server Name Indication,簡稱SNI)是一個擴展的TLS計算機聯網協定,在該協定下,在握手過程開始時客戶端告訴它正在連線的伺服器要連線的主機名稱。這允許伺服器在相同的IP位址和TCP連線埠號上使用多個不同的TLS證書,並且因此允許在相同的IP位址上提供多個安全(HTTPS)網站(或其他任何基於TLS的服務),而不需要所有這些站點使用相同的TLS證書。它與HTTP/1.1基於名稱的虛擬主機的概念相同,但是用於HTTPS。
為了使SNI協定起作用,絕大多數訪問者必須使用實現它的Web瀏覽器。使用未實現SNI瀏覽器的用戶將被提供默認證書,因此很可能會收到主機名和TLS證書使用者名稱不匹配的警告。常見於CDN服務,CDN往往會在一個節點部署多個不同的TLS證書。

問題的背景

當進行TLS連線時,客戶端從Web伺服器請求數字證書。伺服器一旦傳送證書,客戶端就會檢查這個證書,並將其嘗試連線的名稱與證書中包含的名稱進行對比。如果發生匹配,則連線正常進行。如果沒有找到匹配,則可能會向用戶警告該差異,並且可能會中止連線,因為該失配可能表明存在中間人攻擊。不過,某些應用程式允許用戶繞過警告繼續進行連線,由用戶承擔信任證書以及連線的責任。
一個證書覆蓋多個主機名是可以做到的。X.509v3規範引入了subjectAltName欄位,該欄位允許一個證書指定多個域名,並在通用名和subjectAltName欄位中使用通配符
然而,由於缺少所有名稱的完整列表,可能很難甚至不可能獲得涵蓋伺服器將負責的所有名稱的單個證書。負責多個主機名的伺服器可能需要為每個名稱(或一組名稱)提供不同的證書。自2005年以來,CAcert已經在虛擬伺服器上運行了TLS的不同用法的實驗。大多數實驗是不理想和不切實際的。例如,可以使用subjectAltName來包含單個證書中由一個人控制的多個域名。每當域名列表更改時,必須重新發布此類“統一通信證書”。
基於名稱的虛擬主機允許多個DNS主機名由同一IP位址上的單個伺服器(通常為Web伺服器)託管。為了實現這一點,伺服器使用客戶端提供的主機名作為協定的一部分(對於HTTP,名稱顯示在主機頭中)。但是,當使用HTTPS時,TLS握手發生在伺服器看到任何HTTP頭之前。因此,伺服器不可能使用HTTP主機頭中的信息來決定呈現哪個證書,並且因此只有由同一證書覆蓋的名稱才能由同一IP位址提供。
實際上,這意味著對於安全瀏覽來說,HTTPS伺服器只能是每個IP位址服務一個域名(或一組域名)。為每個站點分配單獨的IP位址會增加託管成本,因為對IP位址的請求必須為區域網際網路註冊機構提供證據而且現在IPv4地址已用盡。其結果是,許多網站在IPv4上使用安全通信實際上都受到了限制。IPv6地址空間未用完,因此使用IPv6提供的網站不受此問題的影響。

SNI如何解決此問題

SNI通過讓客戶端傳送虛擬域名的名稱作為TLS協商的一部分來解決此問題。這使伺服器能夠提前選擇正確的虛擬域名,並向瀏覽器提供包含正確名稱的證書。因此,對於實現SNI的客戶端和伺服器,具有單個IP位址的伺服器可以在獲取公共證書不現實的情況下提供一組域名。
SNI在2003年6月的RFC 3546,《傳輸層安全(TLS)擴展》中加入到IETF的Internet RFCs中。最新版本的標準是RFC 6066。

實現

在2004年,EdelKey項目做了一個用於將TLS/SNI添加到OpenSSL中的補丁。在2006年,這個補丁被移植到OpenSSL的開發分支,並在2007年由OpenSSL 0.9.8支持(首次發布在0.9.8f)。
一個應用程式要實現SNI,它使用的TLS庫必須實現SNI,並且該應用程式必須將主機名傳遞給TLS庫。其他複雜的問題有,TLS庫可以包括在應用程式中或者作為底層作業系統的組件。因此,一些瀏覽器在任何作業系統上運行時都能實現SNI,而其他瀏覽器僅在某些作業系統上運行時才能實現SNI。

安全性

由於SNI信息並非加密的,允許審查者區分出“真實”和“虛假”的服務或者識別出用戶訪問的網站域名。現已被部分國家用於網際網路審查。

域前置

主條目:域前置
域前置通過SNI中使用虛假無害的域名信息,已經被TLS加密的套用層才使用真實的域名信息,將真實流量隱藏在看似無害的流量中,從而使審查者無法區別出來,要么一律放行,要么帶有嚴重附加傷害的一刀切封鎖。
GoogleCloudFront曾啟用該技術的支持,之後停止了,被認為是受到俄羅斯政府的壓力,防止Telegram利用該技術來規避審查。

加密伺服器名稱指示(ESNI)

作為TLS的標準擴展實現,TLS 1.3將通過支持加密SNI以解決這個問題。目前,Cloudflare、Mozilla、Fastly和蘋果的開發者已開始制定了關於加密伺服器名稱指示(Encrypted Server Name Indication)的草案。
Cloudflare的聯合創始人兼執行長Matthew Prince曾表示,傳統SNI“絕對是加密裝甲中的最後一個縫隙”。

相關詞條

熱門詞條

聯絡我們