介紹
是什么:SNI(Server Name Indication)是 TLS 的擴展,這允許在握手過程開始時通過客戶端告訴它正在連接的服務器的主機名稱。
作用:用來解決一個服務器擁有多個域名的情況。
在客戶端和服務端建立 HTTPS 的過程中要先進行 TLS 握手,握手后會將 HTTP 報文使用協商好的密鑰加密傳輸。
握手參考:鏈接
在 TLS 握手信息中並沒有攜帶客戶端要訪問的目標地址。這樣會導致一個問題,如果一台服務器有多個虛擬主機,且每個主機的域名不一樣,使用了不一樣的證書,該和哪台虛擬主機進行通信?
和 HTTP 協議用來解決服務器多域名的方案類似:HTTP 在請求頭中使用 Host 字段來指定要訪問的域名。
TLS 的做法,也是加 Host,在 TLS 握手第一階段 ClientHello 的報文中添加。
SNI 在 TLSv1.2 開始得到支持。從 OpenSSL 0.9.8 版本開始支持。所以基本市場上的終端設備都支持。
測試
使用 WireShark 抓包看一下 Clien tHello:
SNI信息是在握手的過程中,確切說是在客戶端發送給服務端的第一個握手包中傳遞的信息。
這時候SSL連接還未建立起來,因此SNI信息是明文傳輸的。