浏览器

“网站使用了 HSTS,您目前无法访问”怎么办

作者: · 最后核实

报错信息You cannot visit example.com right now because the website uses HSTS

“网站使用了 HSTS,您目前无法访问”的意思是:网站曾告诉你的浏览器“必须始终用有效的 HTTPS 证书访问我”(HSTS),而它刚才出示的证书没通过检查。 因为 HSTS,Chrome 和 Firefox 会去掉“继续前往”选项。要修的是底下那个证书问题,而不是 HSTS 本身。

先判断是网站的问题还是你电脑的问题

外部检测发现证书有问题,要由网站修;外部检测正常,原因在你的设备或网络。用 SSL 检测 独立测一下网站:

curl ssl.sh/example.com
  • 检测显示证书有问题:网站要修,访客只能等。
  • 检测显示证书正常:原因在你这边。常见的有系统日期不对、杀毒软件 HTTPS 扫描、公司代理、公共 Wi-Fi 认证页。点 Chrome 页面上的错误代码(比如 NET::ERR_CERT_DATE_INVALID)看是哪项检查失败,再看对应的报错页。

原因

HSTS 拦截背后有 5 种原因,最常见的是网站证书过期、缺域名或缺中间证书。

1. 网站证书坏了

HSTS 把原本可以点过去的警告变成了硬性拦截。见 NET::ERR_CERT_DATE_INVALID 和 NET::ERR_CERT_COMMON_NAME_INVALID。

2. 你的设备或网络在拦截

杀毒软件 HTTPS 扫描、公司 SSL 解密、公共 Wi-Fi 认证页都会出示它们自己的证书。遇到 HSTS 网站,任何不受信任的拦截都会被直接挡住。见 公共 Wi-Fi 认证页报错 和 公司 SSL 解密。

3. 系统时间不对

日期差太多,有效证书也会被判定为无效。把时间改对。

4. 开发环境用了预加载的域名

开发者用 *.dev、*.app,或者公司已预加载域名下的子域名,再配一张自签名证书,马上就会遇到这个错误,因为这些名字在所有浏览器里都是 HSTS 预加载的。

5. 设置过 HSTS 的主机后来没了 HTTPS

某个域名以前发过 Strict-Transport-Security,后来去掉了 HTTPS(或者迁到没有证书的主机),老访客在 max-age 到期前都会被拦住。常见于把网站从带证书的 CDN 换到只开 HTTP 的临时空间。

在各浏览器/系统上的样子

Chrome、Firefox 和 Safari 遇到 HSTS 网站的证书错误时,都不提供继续访问的选项。

浏览器 显示内容
Chrome / Edge / 360 / QQ 浏览器 证书警告页说明“网站使用了 HSTS,您目前无法访问”,没有继续前往的链接
Firefox “未连接:有潜在的安全问题”,说明网站使用 HSTS、无法添加例外
Safari “此连接非私人连接”,没有“仍然访问”选项

站长怎么修

站长要先修好证书,再按子域名的实际情况设置 HSTS。

1. 把证书修好。 运行 curl ssl.sh/example.com,然后续期、补域名或发送完整证书链。

2. 谨慎设置 HSTS。 只有在包含的所有子域名都能正常 HTTPS 访问后再发送:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

宝塔面板的 SSL 设置里有 HSTS 开关,打开前先确认所有子域名都配好了证书。用 HSTS 检测 检查响应头。

3. 自己的开发域名可以删除动态 HSTS 记录:Chrome 打开 chrome://net-internals/#hsts,在“Delete domain security policies”里输入域名;Firefox 在“历史记录”里右键该网站,选“忘记此网站”。预加载条目用这种方法删不掉。

4. 预加载撤销要好几个月。 通过 hstspreload.org 撤销预加载,要等各浏览器发布新列表后才生效,所以只有在确定所有子域名都会长期保持 HTTPS 时才去预加载。原理见 HSTS 详解。

常见问题

有没有办法绕过 HSTS 报错?

不应该绕,浏览器是故意去掉绕过选项的。HSTS 的意义在于:即使有人拿假证书冒充网站,也骗不了你点继续。应该修根本原因:系统时间、拦截软件,或者网站的证书。

本地开发用的 .dev 域名为什么总报 HSTS 错误?

.dev 和 .app 整个顶级域都在 HSTS 预加载列表里,浏览器访问这些域名一律要求有效的 HTTPS。本地开发请改用 .test 或 .localhost,或者给它签一张本机信任的证书。

HSTS 会持续多久?

持续响应头里 max-age 指定的时长,从最后一次收到该响应头的访问开始计算。常见值是 31536000 秒(一年)。预加载条目则一直有效,直到域名从列表中移除、并且浏览器发布了更新。

资料来源

  1. RFC 6797: HTTP Strict Transport Security
  2. MDN:Strict-Transport-Security
  3. HSTS Preload List Submission
  4. Google Chrome 帮助:修正连接错误