我有一个 IIS 网站,该网站托管 3 个不同的网站,所有网站均使用相同的 UCC SSL 证书。(我的网站代码会检查主机标头本身,以决定显示网站的哪个变体)。
我已经为 XP 上的 Internet Explorer 用户修复了最致命的错误,即禁用 IIS 中的“需要主题名称指示”字段。由于 SNI不支持 Windows XP如果在 XP 用户切换到 HTTPS 时启用该功能,他们基本上会在没有任何警告的情况下被踢出网站(不要告诉我的老板)。
因此,我完全理解,当用户通过 HTTPS 访问共享同一 IP 的 3 个站点中的任何一个时,他都会被发送到同一个 IIS 站点并提供 UCC 证书。即使 XP 也支持 UCC/SAN 证书,因此客户端会接受证书并按预期显示站点。
现在......忘记所有这些,并考虑第二个非假设的情景。
- 假设我有两个网站:
cats.com
和dogs.com
- 它们是不同的站点,部署在 IIS 8 中的两个不同的网站中。
- 它们都位于同一个 UCC SSL 证书上*
- SNI 已禁用
- 它们都绑定到同一个 IP 地址
现在考虑 XP 用户访问https://cats.com
以下是我理解的事物运作方式:
- DNS 将我的 IP 返回给浏览器 - 假设
1.2.3.4
- 已协商 HTTPs 连接,但由于 XP 对 SNI 一无所知,因此它不会发送 SSL 主机标头(或任何名称),而只是通过 IP 访问安全站点。
- 因此 IIS 将查找与 https 网站绑定关联的 IP,并且实际上会找到两个。
- 假设 IIS 决定只为您提供第一个 - 因此它会为您提供
cats.com
您所期望的内容。所以这没问题。 - 但是假设您访问
https://dogs.com
- 您实际上不应该为该网站提供服务吗,cats.com
因为 XP 上的 SSL 不知道 SSL 连接的 SNI,并且它在 IIS 中被禁用了?
其实你不需要。你可以访问 dogs.com。我试过这个,cats.com
两者dogs.com
都可以在 Windows XP Internet Explorer 8 客户端上运行。
我只是不明白为什么会这样。我本以为这种行为只会在我的第一个场景中出现,那时他们都共享一个 IIS 应用程序。
我最好的猜测是 IIS 8 无论如何都会接收主机标头,并且足够智能地将其路由到正确的网站并找到 UCC 证书名称。这是怎么回事?
有人可以进一步解释一下吗?
* 只是为了故意惹恼那些热衷于技术的猫狗主人 ;-)
答案1
IIS 使用 HTTP Host: 标头来确定要服务哪个网站,就像任何其他请求一样。