【问题标题】:Browser caches HTTP site as HTTPS resulting in Cert Error when navigating from site to an HTTPS destination浏览器将 HTTP 站点缓存为 HTTPS,从站点导航到 HTTPS 目标时导致证书错误
【发布时间】:2018-09-03 01:45:46
【问题描述】:

我有一个托管为https://foo.bar.com 的公司网站。

但是,很多用户错误地认为 URL 是 www.foo.bar.com。在此问题得到纠正之前,我们将通过设置代理站点 www.foo.bar.com 来实施临时解决方案,该站点会将任何访问该站点的用户重定向到 https://foo.bar.com

这可行...但仅在用户第一次导航到该页面时。下次我尝试访问 www.foo.bar.com 时,由于缓存,浏览器会将我带到https://www.foo.bar.com。我们没有为 https://www.foo.bar.com 设置证书,因此出现 NET::ERR_CERT_COMMON_NAME_INVALID 错误。

有没有办法在不需要证书的情况下解决这个问题?

为了进行测试,我什至尝试在导航到 www.foo.bar.com 时返回一个网页,其中包含导航到 https://foo.bar.com 的链接。但是,即使在这种情况下也会发生同样的问题。我猜 HSTS 在这里发挥作用,但不知道如何去做。

感谢您对此事的任何见解,在此先感谢您。

【问题讨论】:

  • 你不能只从let's encrypt 获得 www.foo.bar.com 的证书吗?您如何进行正在缓存的初始重定向?
  • @kicken 如果必须使用证书完成,那么我们知道前进的方向。为了解决审批流程,我们正在尝试查看是否有一种无需依赖证书即可继续进行的方法。当我导航到 www.foo.bar.com 时,我尝试使用 window.location.replace 和 window.location.href 进行重定向。
  • 有效的证书是修复 NET::ERR_CERT_COMMON_NAME_INVALID 的唯一方法。
  • @kicken 我明白这一点,但我不确定为什么它只会在第二次以后发生。我第一次访问 www.foo.bar.com 时,它会按预期将我重定向到 https:// foo.bar.com,而没有任何证书问题。我猜这是因为 HSTS,重定向完成后,它会缓存“https://www.foo.bar.com”而不是“http://www.foo.bar.com”。我猜在客户端和服务器之间的初始通信之后,浏览器看到 Strict-Policy-Security 标头并且知道它必须使用“https”而不是“http”保存 URL。如果有办法覆盖这种行为,那就是我所追求的
  • 第一次尝试后,即使我尝试手动导航到“http://www.foo.bar.com”,浏览器也会将“http”更改为“https”。

标签: http https cache-control http-redirect


【解决方案1】:

我相信解决您的问题的唯一方法是获取 www.foo.bar.com 的有效证书。由于证书错误,浏览器不会尝试与您的服务器通信,因此您无法发出从错误域到正确域的重定向。

为什么只有第二次?

您提到了 HSTS,所以我假设 https://foo.bar.com 正在发送 Strict-Transport-Security 标头作为其响应的一部分。此标头可能是通过 includeSubDomains 选项发送的,该选项指示浏览器不仅在 foo.bar.com 上强制执行 HTTPS,而且还强制该主域的所有子域。因此,当尝试请求 www.foo.bar.com 时,浏览器会匹配该 HSTS 规则并自动将其重写为使用 HTTPS。

一旦在浏览器中设置了这个 HSTS 规则,它就不能被删除,除非过期,要么超过原始的 max-age 时间,要么发出另一个带有 ma​​x-age=0https://foo.bar.com

【讨论】:

  • 感谢您的确认。我也得出了同样的结论。接受这个答案。
猜你喜欢
  • 1970-01-01
  • 2011-09-01
  • 2012-12-01
  • 2014-04-23
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多