知識庫

在 Windows 伺服器上設定非 SNI 用戶端

如今在同一台伺服器上托管多個網站使用相同的 IP 地址是一種普遍做法。在這種情況下,客戶端和伺服器都需要支持 伺服器名稱指示 (SNI) 技術,以請求並接收為該域名發出的匹配證書。SNI 依賴於客戶端在 SSL 握手過程中發送 ServerName 標頭,這意味著客戶端支持 SNI 是至關重要的。雖然大多數現代應用程序配置為支援 SNI,但支持較舊/傳統的客戶端將需要額外的配置。

本文將涵蓋如何在 Windows 伺服器上支持不兼容 SNI 的客戶端。

注意: 支持 SNI 的瀏覽器列表可以在 這裡找到。

SNI 支持自 Microsoft IIS 8.0 開始添加。要求伺服器名稱指示 是網站綁定中的選項,該選項允許將多個證書綁定到使用相同 IP 地址的不同網站:

sniw1

對於此類 SNI 綁定,伺服器將期望收到 ServerName 標頭。如果一個不支持 SNI 的客戶端嘗試進行 HTTPS 連接,伺服器將不會收到 ServerName 標頭,並且不會發送證書。這會導致 SSL 握手錯誤,因此無法建立 HTTPS 連接。

具有 SNI 的連接

以下是帶有 ServerName 標頭的 SSL 連接示例。伺服器檢查該標頭並發送正確的證書:

sniw9

不具有 SNI 的連接

這裡是對同一伺服器進行 SSL 連接的示例,未包含 ServerName 標頭。請注意,伺服器未發送證書:

sniw3

解決方案:可以創建對 0.0.0.0:443 的手動證書綁定,當客戶端未發送 ServerName 標頭時,該證書將用作 HTTPS 連接的後備證書。每個端口只能配置一個備用證書。

以下 PowerShell 命令用於創建此綁定:

netsh http add sslcert ipport=0.0.0.0:443 certhash=thumbprint appid='{5d89a20c-beab-4389-9447-324788eb944a}'

注意:運行此命令需要以管理員身份登錄。


確定證書指紋

檢查證書指紋有幾種方法:

  1. 在 PowerShell 中檢查伺服器上安裝的證書

    您可以使用以下命令檢查伺服器上安裝的證書: dir Cert:LocalMachineMy

    示例:

    sniw4

  2. 在 PowerShell 中檢查現有綁定
  3. 可以使用以下 PowerShell 命令檢查現有綁定: netsh http show sslcert

    示例:

    sniw5

  4. 在 MMC 中檢查證書屬性
  5. 您可以使用 MMC 中的證書管理單元檢查證書屬性。在詳細信息選項卡中向下滾動可以找到指紋:

    sniw6

  6. 在 decoder.link 解碼證書
  7. 您可以在這裡檢查指紋: sslchecker
    輸出將包含 SHA-1 指紋(指紋):

    sniw7

在 PowerShell 中運行命令

最後,該命令將類似於這樣:

netsh http add sslcert ipport=0.0.0.0:443 certhash=c09643b93bd9b06430346f8a9ba4feb5f3ebc59b appid='{5d89a20c-beab-4389-9447-324788eb944a}'

輸入後,伺服器將確認綁定已添加:

sniw7.1

您可以通過檢查現有綁定來驗證綁定是否已添加: netsh http show sslcert

sniw8

從現在起,當客戶端未指定 ServerName 時,將使用該證書:

sniw2

幾點總結

  1. 如果在該 IP 地址上僅托管一個網站,則不必配置備用證書。相反,在創建綁定時,可以關閉 要求伺服器名稱指示 選項。
  2. 對於 IIS 8.0 之前的版本,僅能為 IP 地址創建綁定(每個 IP 地址一個綁定)。
  3. 如果需要為多個網站配置支持不支持 SNI 的客戶端,請考慮使用 多域名證書 作為後備。