我在使 IIS 8.5 服务器按预期运行时遇到了问题。我尝试使用不同的 Web 服务器在同一 IP 地址上托管两个域,均使用 https。
当然,IIS 被设置为我的“主要”网络服务器,监听 80 和 443。这里设置了一个带有 SSL 证书的域。我使用“URL 重写”模式将不安全的流量发送到安全端。另一个域设置为虚拟主机,并使用“HTTP 重定向”功能将流量发送到第二个网络服务器。对于第二个网络服务器,我使用 Apache 2.4 监听 8443,也带有证书。
简而言之: http://example1.com-> URL 重写 ->https://example1.com https://example1.com-> 由 IIS 解析并提供
http://example2.com-> HTTP 重定向 ->https://example2.com:8443 https://example2.com:8443-> 由 Apache 解析并提供服务
我的问题是浏览器(FF 或 Chrome)访问后http://example2.com并重定向至https://example2.com:8443,后续访问总是去https://example2.com(没有端口)。这会失败,因为在 SSL 握手期间,浏览器会获得 example1 的证书。
我已经将此问题追溯到这两个依赖 HSTS 的浏览器。一旦我清除 HSTS 缓存,它们就能再次找到正确的网站(带有端口)。
我如何才能让这个设置顺利运行?我在 Apache 的配置文件中没有看到任何设置 HSTS 的内容,所以我假设它在 IIS 重定向中。我查看了这个答案讨论 IIS 上的 HSTS,我想我可以修改 Doug 的建议,将其设置max-age
为零以防止它被设置,但它似乎不起作用。
解决方案:
根据以下建议,最好的解决方案是在 IIS 中托管两个域,绑定 SSL 证书并在绑定中选中“需要服务器名称指示”框。我必须对共享 IP 的所有域执行此操作。然后我可以创建一个反向代理(需要 URL 重写和应用程序请求路由模块),将流量转交给 Apache 托管的实例。
答案1
使用您当前的设置,您无法做到这一点。
这HSTS 请求函数声明如下:
UA 必须将 URI 方案替换为“https”[RFC2818],并且
如果 URI 包含显式端口组件“80”,则 UA 必须将端口组件转换为“443”,或者
如果 URI 包含不等于“80”的显式端口组件,则必须保留端口组件值;否则,
如果 URI 不包含显式端口组件,则 UA 不得添加。
注意:这些步骤确保 HSTS 策略适用于 HSTS 主机的任何 TCP 端口上的 HTTP。
所以要http://www.example2.com:8443将保留端口并重定向至https://www.example2.com:8443但你不能做同样的事情http://www.example2.com。
因此您有以下选择:
停止在 Apache 中为 example2.com 使用 HSTS,仅在 IIS 中为 example1.com 使用它
使用一个主服务器监听端口 80 和 443,并将对 example.com 的请求代理到端口 8443 上的另一个服务器。这样更简洁,因为不需要用户使用非标准端口(如 8443)。但是,由于您对两个站点使用相同的 IP 地址,因此您必须使用称为服务器名称标识或 SNI 的过程(XP/IE8 等旧浏览器不支持该过程)才能通过相同的 IP 地址为相同的主机正确提供 HTTPS 服务,或者作为变通方法对两个站点使用相同的证书(请参阅答案)点击此处了解其工作原理)。