我有一台 IIS 服务器托管:
example.com/www.example.com
sub1.example.com
sub2.example.com
它们在 IIS 下被列为 3 个独立站点,均通过 443 上的 HTTPS 绑定到同一 IP。但它们都使用相同的 SSL 证书,即覆盖 *.example.com 的通配符证书
在这种情况下,我的理解是 SNI 不是必需的,因为无论服务器为任何请求提供哪种证书(即相同的证书),它都会适用于所有网站,对吗?我自己测试过,它似乎可以工作,但我只是想确保这样做不会给某些用户带来任何意外的不良后果(如果可能的话,我不想使用 SNI,因为我确实希望这些网站支持 Windows XP)
出于好奇,我确实想知道当您有这样的设置时(同一 IP 上通过 SSL 的多个站点但不启用 SNI),IIS 究竟如何决定提供哪个证书(IP 上的第一个 443 绑定?还是最后一个使用的?)
此外,如果此设置有效,将来如果我将 example.org 添加到同一个 IIS 服务器并使用不同的 SSL 证书,我可以仅为 example.org 启用 SNI 而不影响其他 3 个站点吗?
答案1
经验法则是,在 HTTP API 级别,
- 您可以绑定单身的证书到 IP:443 作为基于 IP 的映射。
- 您可以将证书绑定到域:443 作为 SNI 映射。
此类映射可以通过以下方式进行可视化分析Jexus 管理器。
当 SSL/TLS 握手开始时,将首先扫描 SNI 映射以匹配请求中的主机名(来自支持 SNI 的浏览器)。如果没有匹配的 SNI 映射,则扫描基于 IP 的映射。这就是解析顺序。
在 IIS 管理器中配置站点时会创建和更新映射。但是,HTTP API 中的此类映射与 IIS 配置是分开的。即使 IIS 中的站点被删除,它们仍会存在。
就您而言,由于您只有通配符证书,因此在 IIS 管理器中配置多个站点不会覆盖基于 IP 的映射,并且应该可以完美运行。
但是,当您尝试使用另一个证书配置第二个域时,您不能使用相同的 IP 地址(因为该 IP:443 映射已经存在)。如果您在 IIS 管理器中强制配置该映射,则应覆盖以前的证书。当然,可以使用 SNI 映射。
答案2
从技术上讲,不需要 SNI,因为所有网站都共享同一个证书。IIS 是足够聪明(至少看起来)Host:
使用HTTP 标头区分网站在非 SNI 客户端上(甚至可能在启用 SNI 的客户端上),所以一切都按预期工作。
对于证书“优先级”,您可以查看颁发时使用的证书,并且可以通过禁用特定网站的选项netsh http show sslcert
来选择默认证书(用于非 SNI 客户端) (在Require Server Name Indication
网站绑定设置窗口)。更多信息请点击这里:https://stackoverflow.com/questions/19565961/default-certificate-for-sni-server-name-indication
这也应该回答你的第三个问题:如果你添加另一个具有 SNI 的网站,现有网站将不会发生任何变化(当然,通过使用不同的域名和不同的证书,example.org
仅支持 SNI 的客户端可访问)
答案3
仅当所有端口 443 流量(或您正在安全监听的任何端口)都使用相同的证书时,才不需要 SNI。SNI 不是协商的事情,这意味着除非您通过在每个客户端上编辑注册表关闭 SNI。如果客户端支持扩展(现在所有东西都支持),它仍将发送 SNI。关闭服务器上的要求不会改变客户端的行为方式,只会改变服务器的行为方式。如果服务器上的 SNI 已关闭,则将始终使用默认证书。服务器决定向客户端发送什么证书,客户端只是第三方验证它。对于许多 Web 服务器,如果未指定默认证书,则它加载的第一个证书将用于此目的(如果服务器上的 SNI 已关闭)。客户端不选择证书,服务器选择。在解密发生之前,服务器无法看到主机标头。客户端 TLS 协商请求中的 SNI 扩展允许服务器选择要发送的其他证书,以便客户端正确地根据第三方 CA 验证域。如果客户端从不发送 SNI 属性,那么无论服务器如何设置,它都会发送默认证书或导致连接失败(取决于服务器行为)。