我在 IIS 8.0 中将站点 A 配置为 SSL 证书,绑定为 ###.###.###.###:443。我还将站点 B 配置为不同的具有绑定 ###.###.###.###:443 的证书(相同 IP 但主机 = sub.domain.com)对于站点 B 绑定,我选中了 SNI 启用框,因此 IIS 允许它。
问题是,我发现从启用 SNI 的浏览器加载站点 B 会为站点 A 提供证书。我认为这是因为站点 A 绑定在技术上已得到满足,因此 IIS 停止查看其他绑定来满足请求。(我注意到该netsh http show sslcert
命令似乎按显示顺序首先显示站点 A 绑定,尽管我不知道该顺序是否有意义。)
有没有办法更改 IIS 中的绑定顺序,以便它首先尝试将请求绑定到站点 B SNI 主机绑定,然后才回退到站点 A 非 SNI(仅 IP:端口)绑定?(为了与旧版本兼容,我不想在站点 A 绑定上启用 SNI。)
答案1
管理工具的行为不够一致,无法允许您对绑定进行排序。
我认为,这样做的原因在于,您的绑定应该足够明确,不需要排序。
请注意,在幕后,Web 管理 MMC(和 Microsoft.Web.Administration API)正在管理 IIS 服务器配置文件中的设置,和在操作系统网络层设置中,我认为它在注册表中。
我使用 netsh 查看了工具创建的绑定,发现 iis 配置文件中的顺序和 netsh 中显示的顺序(netsh hhtp show sslcert)不同且显示顺序任意,即使顺序“正确”,我有时仍然无法获取尝试为域配置的证书。
我尝试做的是通过 DNS 中的 IP 地址为虚拟服务器分配域,然后设置所有 SNI 证书,再加上每个没有 SNI 的虚拟服务器的一个通配符证书,仅将 IP 地址作为该虚拟服务器/IP 地址的默认地址。
如果你花点时间调整一下设置,这似乎会起作用,因为 TLS 绑定规则适用于一些顺序,如果您假设某些编辑会进行删除和添加,则该顺序往往与添加绑定的顺序相同或相似。
但是,当您查看 netsh 中的绑定时,就会发现您放入 iis 管理绑定中的内容要么使用 SNI 并忽略 IP 地址,要么使用 IP 地址并忽略域。SNI 绑定设置中的 IP 地址虽然出现在对话框和 iis 配置文件中,但不会传递给管理 TLS 的网络层的配置,并且 SNI 域将为服务器上的任何 IP 地址获取该证书。
因此,服务器可以使用任何一个信噪比或者通配符证书,但使用两者并尝试让服务首先使用 SNI 匹配,而对其他所有服务使用通配符,这实际上不受支持。有时它似乎有效,但任何配置编辑甚至重新启动都可能改变网络层内的处理顺序。
如果您想要订购绑定以应用模糊的 ipaddress 和 SNI 规则组合,答案是否定的,您无法始终如一地、可预测地做到这一点。如果某个 IP 地址的所有域/子域都使用相同的通配符证书,则可以设置多个虚拟服务器以使用该 IP 地址而不使用 SNI,但如果您需要在同一 IP 地址上使用多个证书,则需要为服务器上的每个子域设置一个 SNI 绑定。
SNI / IPaddress 规则的唯一例外是,即使你正在使用 SNI,你也可以分配一通过为 IP 地址选择“全部未签名”且无 SNI,将证书设置为服务器(所有虚拟服务器)的默认证书。该证书将用于任何 IP 和任何域,但仅用于与任何其他指定绑定规则不匹配的请求。这似乎被视为一种特殊情况,管理 MMC 甚至可能在您未设置不支持 SNI 的浏览器时发出警告,称没有默认 https 绑定...
当然,如果你(读者,而不是原始发帖人)不是尝试将 SNI 与非 SNI IP 地址绑定混合,但只是尝试在 UI 中管理一长串绑定,您可以单击“主机名”标题,然后按该列对列表进行排序(再次单击可更改升序/降序)对于原始问题,您可以对第一个域使用“全部未分配”例外。SNI 绑定在功能上已经是“全部未分配”,因为 SNI 绑定会忽略 IP 地址。
答案2
为什么不将使用的证书更改为包含 IP 和主机名的单个证书?
请注意,我相信目前的最佳做法是不要为 IP 地址颁发 SSL 证书,当然,如果这些是内部证书,那么您就不会遇到此问题。