知识库

在 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 的客户端,请考虑使用 多域名证书 作为后备。