解决浏览器HSTS导致的http地址无法访问
起因
我的个人域名下关联了特别多的服务,有的开启了 HTTPS,有的依旧是 HTTP,但最近发现 HTTP 协议的网站都打不开,查看地址栏发现都自动重定向到 https://
前缀了,但其实在我的站点配置上并没有启用 Force Https
选项。网上查询,找到原因是:浏览器开启了 HSTS(HTTP Strict Transport Security)功能,它会告诉浏览器只能通过 https 访问,绝对禁止 http 方式,所以浏览器中输入 http 后自动转成了 https。
解决办法
- Chrome 内核浏览器在地址栏输入
chrome://net-internals/#hsts
- 在
Query HSTS/PKP domain
里输入域名,如果发现有记录,就说明有 HSTS,则需要删除。
- 在
Delete domain security policies
里输入域名,点击删除按钮,再次查询,显示 Not found 即可。
当我删除过后,不久之后就发现又不行了,再次查询发现又出现了记录。因此怀疑并不是跟浏览器相关,可能是跟网站或域名有关系。
排查步骤
-
https://www.chromium.org/hsts/ 上介绍了 sts 有 静态(static)和动态(dynamic)之分,而动态 sts 一般是在启用了 HSTS 的服务器在 HTTPS 回复头中包含了以下 header:
而通过查看上面截图发现这个 sts 就是 dynamic_sts_domian,说明是该域名下某个服务器开启了 HSTS。
-
锁定了原因,开始排查域名下各个服务,方法是访问一个 domain:port 服务后,就来 query 以下 sts,直到排查到了 Lsky Pro,打开浏览器,查看一条 request,可以看到:
-
定位了服务,开始排查是在哪里开启了 HSTS,查询文档可知 Lsky Pro 不具备自定义 HTTPS 和 SSL 证书的功能,因此只可能是 nginx 反向代理做的设置。而我的网络拓扑中,Lsky Pro 是放在了 NAS 上,利用的群晖内置的反向代理设置。
-
进入群晖控制台 -> 登录门户 -> 高级 -> 反向代理服务器 -> 打开这一条记录,可以看到果然开启了 HSTS。
-
取消勾选 " 启用 HSTS",点击保存,重新回到 LskyPro 去测试,已经不会在自动带着 Strict-Transport-Security 的 header 了。问题终于彻底解决。