如今在同一台服务器上托管多个网站使用相同的 IP 地址是一种普遍做法。在这种情况下,客户端和服务器都需要支持 服务器名称指示 (SNI) 技术,以请求并接收为该域名发出的匹配证书。SNI 依赖于客户端在 SSL 握手过程中发送 ServerName 标头,这意味着客户端支持 SNI 是至关重要的。虽然大多数现代应用程序配置为支持 SNI,但支持较旧/传统的客户端将需要额外的配置。
本文将涵盖如何在 Windows 服务器上支持不兼容 SNI 的客户端。
注意: 支持 SNI 的浏览器列表可以在 这里找到。
SNI 支持自 Microsoft IIS 8.0 开始添加。要求服务器名称指示 是网站绑定中的选项,该选项允许将多个证书绑定到使用相同 IP 地址的不同网站:

对于此类 SNI 绑定,服务器将期望收到 ServerName 标头。如果一个不支持 SNI 的客户端尝试进行 HTTPS 连接,服务器将不会收到 ServerName 标头,并且不会发送证书。这会导致 SSL 握手错误,因此无法建立 HTTPS 连接。
具有 SNI 的连接
以下是带有 ServerName 标头的 SSL 连接示例。服务器检查该标头并发送正确的证书:

不具有 SNI 的连接
这里是对同一服务器进行 SSL 连接的示例,未包含 ServerName 标头。请注意,服务器未发送证书:

解决方案:可以创建对 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}'
注意:运行此命令需要以管理员身份登录。
确定证书指纹
检查证书指纹有几种方法:
- 在 PowerShell 中检查服务器上安装的证书
您可以使用以下命令检查服务器上安装的证书: dir Cert:LocalMachineMy
示例:

- 在 PowerShell 中检查现有绑定
- 在 MMC 中检查证书属性
- 在 decoder.link 解碼证书
可以使用以下 PowerShell 命令检查现有绑定: netsh http show sslcert
示例:

您可以使用 MMC 中的证书管理单元检查证书属性。在详细信息选项卡中向下滚动可以找到指纹:

您可以在这里检查指纹: sslchecker
输出将包含 SHA-1 指纹(指纹):

在 PowerShell 中运行命令
最后,该命令将类似于这样:
netsh http add sslcert ipport=0.0.0.0:443 certhash=c09643b93bd9b06430346f8a9ba4feb5f3ebc59b appid='{5d89a20c-beab-4389-9447-324788eb944a}'
输入后,服务器将确认绑定已添加:

您可以通过检查现有绑定来验证绑定是否已添加: netsh http show sslcert

从现在起,当客户端未指定 ServerName 时,将使用该证书:

几点总结
- 如果在该 IP 地址上仅托管一个网站,则不必配置备用证书。相反,在创建绑定时,可以关闭 要求服务器名称指示 选项。
- 对于 IIS 8.0 之前的版本,仅能为 IP 地址创建绑定(每个 IP 地址一个绑定)。
- 如果需要为多个网站配置支持不支持 SNI 的客户端,请考虑使用 多域名证书 作为后备。