我有两个不同的“家族”相关站点,每个站点在同一台服务器上都有自己的 UCC 证书。
我将它们托管在同一个 IIS 服务器上,每个家庭使用一个 IP 地址。
两个 UCC 证书均来自 GoDaddy。
每个绑定(针对 UCC 中的每个 SAN)都禁用了“需要服务器名称指示”。
但是,当我尝试在 Windows XP 上从 IE 8 访问该站点时,只有一个“家族”站点可以工作。另一个只是不谈判。
在SSLLabs.com上分析 SSL 时,我得到以下结果 - 告诉我“该站点仅适用于支持 SNI 的浏览器。”
但这怎么可能!我为每个 :443 绑定禁用了“需要 SNI”。
我什至查看了该applicationHost.config
文件,没有一个站点sslFlags="1"
表明此设置已启用。是的,我还重新启动了 IIS。
这是怎么回事。我很困惑。我想知道我是否可以以某种方式完全禁用服务器上的 SNI,或者是什么触发了这种情况。昨天我进行了几个月的 Windows 更新,但坦率地说,我认为这种方式已经持续了很长时间,而我没有意识到 - 基于 IE8 XP 客户端的 0 美元销售额;-)
编辑:
我真的认为我的 IIS 已损坏。当我运行netsh http show sslcert
每一个绑定的形式是 IP:port。根据这篇文章,如果启用了 SNI,那么我会看到hostname:port
并且我看不到这种格式的条目。注册表中也没有任何条目HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\SslSniBindingInfo
- 但我确认如果我临时添加 SNI 绑定,则会在此处创建一个新条目。
IP:port : 10.0.0.2:443
Certificate Hash : d59a149e6678bc10d62093401c5b705cc23094be
Application ID : {4dc3e181-e14b-4a21-b022-59fc669b0914}
Certificate Store Name : My
Verify Client Certificate Revocation : Enabled
Verify Revocation Using Cached Client Certificate Only : Disabled
Usage Check : Enabled
Revocation Freshness Time : 0
URL Retrieval Timeout : 0
Ctl Identifier : (null)
Ctl Store Name : (null)
DS Mapper Usage : Disabled
Negotiate Client Certificate : Disabled
我没有提到的一件事是我正在使用IIS 集中证书存储- 结果证明这很重要。
对于我的站点,让我们假设它们是以下组(IP 是内部的并通过防火墙映射)。
A 组是按照我的意愿工作的组(没有报告它需要 SNI)。B 组没有在带有 IIS 8 的 XP 上工作。
在我的证书存储中,我有每个证书的多个副本(只是
pfx
文件系统中的文件)。red.com.pfx
blue.com.pfx
green.com.pfx
等所有网站当我运行命令
netsh http show sslcert
时,结果发现只有一个 for10.0.0.1:443
而不是 for10.0.0.2:443
。这就是导致每个站点出现不同行为的原因。为什么这个 IP 显示一个条目?我还在另一个网站上有一个额外的绑定,具有相同的证书,用于相同的 IP 地址(用于将非 SSL 重定向到 SSL)。
我猜 IIS 假设如果您使用的是集中式存储,那么您正在使用 SNI,因此它似乎隐含地报告它需要它 - 即使它确实不需要。
我能够 [最终] 通过更改我对组 B 的一个绑定以明确引用证书而不是仅仅在商店中查找它来解决这个问题。当然,在这样做之后,
10.0.0.2:443
条目就会出现在netsh http show sslcert
列表中,并且该站点在 XP 中运行良好 :-)(我只需要这样做
dog.com
。其他动物站点仍设置为使用中央商店)。你说,
这正是SNI 设计的场景。
由于这些站点共享相同的 IP 地址和端口,因此区分它们的唯一方法是通过域名。但是,如果没有 SNI 支持,服务器在决定将哪个证书发送给客户端时就无法访问域名。这是因为客户端还没有发送请求,而域名是 HTTP 请求的一部分。