起因

我的个人域名下关联了特别多的服务,有的开启了 HTTPS,有的依旧是 HTTP,但最近发现 HTTP 协议的网站都打不开,查看地址栏发现都自动重定向到 https:// 前缀了,但其实在我的站点配置上并没有启用 Force Https 选项。网上查询,找到原因是:浏览器开启了 HSTS(HTTP Strict Transport Security)功能,它会告诉浏览器只能通过 https 访问,绝对禁止 http 方式,所以浏览器中输入 http 后自动转成了 https。

解决办法

  1. Chrome 内核浏览器在地址栏输入 chrome://net-internals/#hsts
  2. Query HSTS/PKP domain 里输入域名,如果发现有记录,就说明有 HSTS,则需要删除。
    CleanShot 2024-08-15 at 18.24.24@2x.png
  3. Delete domain security policies 里输入域名,点击删除按钮,再次查询,显示 Not found 即可。

当我删除过后,不久之后就发现又不行了,再次查询发现又出现了记录。因此怀疑并不是跟浏览器相关,可能是跟网站或域名有关系。

排查步骤

  1. https://www.chromium.org/hsts/ 上介绍了 sts 有 静态(static)和动态(dynamic)之分,而动态 sts 一般是在启用了 HSTS 的服务器在 HTTPS 回复头中包含了以下 header:

    1
    Strict-Transport-Security: max-age=16070400; includeSubDomains

    而通过查看上面截图发现这个 sts 就是 dynamic_sts_domian,说明是该域名下某个服务器开启了 HSTS。

  2. 锁定了原因,开始排查域名下各个服务,方法是访问一个 domain:port 服务后,就来 query 以下 sts,直到排查到了 Lsky Pro,打开浏览器,查看一条 request,可以看到:

    CleanShot 2024-08-17 at 20.48.42@2x.png

  3. 定位了服务,开始排查是在哪里开启了 HSTS,查询文档可知 Lsky Pro 不具备自定义 HTTPS 和 SSL 证书的功能,因此只可能是 nginx 反向代理做的设置。而我的网络拓扑中,Lsky Pro 是放在了 NAS 上,利用的群晖内置的反向代理设置。

  4. 进入群晖控制台 -> 登录门户 -> 高级 -> 反向代理服务器 -> 打开这一条记录,可以看到果然开启了 HSTS。CleanShot 2024-08-17 at 20.53.07@2x.png

  5. 取消勾选 " 启用 HSTS",点击保存,重新回到 LskyPro 去测试,已经不会在自动带着 Strict-Transport-Security 的 header 了。问题终于彻底解决。