CertH certH
本页目录

HSTS 详解:max-age、preload,以及什么会出事

更新于 2026-11-03 · 6 分钟阅读

HSTS 是唯一一个能让站点彻底打不开的安全响应头——包括站主自己也打不开。它同时又是 A+ 的必要条件。这两件事之间的落差,完全取决于上线时的克制程度。

这个响应头到底做了什么

Strict-Transport-Security 告诉浏览器:在未来 N 秒内,这个主机只能通过 HTTPS 访问。一旦收到,浏览器就会改写页面里的 http:// 链接、屏蔽「继续访问」的证书错误按钮、直接拒绝明文 HTTP——这一切都发生在请求离开本机之前。

这正是它能防住重定向防不住的降级攻击的原因:重定向的第一次请求仍然是明文的,而那恰恰是网络上的攻击者想拦的那一个请求。

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

max-age 是一个你无法取消的倒计时

max-age 存在客户端。如果你下发了一年,之后又把这个响应头删掉,所有已经见过它的浏览器仍会强制 HTTPS,最长一年。服务端没有任何开关能立刻关掉它。

CertH 把 180 天(15552000 秒)当作 A+ 的门槛。一年是生产环境常见值。低于 180 天在摘要里仍算「已启用 HSTS」,但解锁不了 A+。

includeSubDomains 和 preload 是两个独立决定

includeSubDomains 把规则扩展到所有子域名。只要有一个子域名只支持 HTTP——内部工具、老后台、staging 主机——对访问过主域的任何人来说它就打不开了。先把 DNS 盘一遍。

preload 更进一步:域名会被写进浏览器内置的列表,规则在首次访问、还没收到任何响应头时就生效。撤销要几个月,还得提交到移除列表。在响应头稳定运行几个月之前,别加 preload。

  • •每一个 HTTPS 响应都要带这个头,包括错误页——没有它的 404 教不会浏览器任何东西。
  • •绝不要通过明文 HTTP 下发 HSTS;按规范浏览器会忽略它,所以配错的重定向循环没法用这招修。
  • •加 includeSubDomains 之前,先检查子域名里有没有只支持 HTTP 的服务。
  • •preload 放最后加,而且要等 max-age 稳定在一年的值之后。

一套不会弄坏任何东西的上线方式

先用很短的 max-age,让错误能很快过期:max-age=300。维持一周,盯住挂掉的子域名和混合内容报告。然后改成一天,再一个月,再一年。每一步都能在上一个时间窗口内回退——这正是「先短」的意义。

如果真出事了,正确的修法是让出问题的那个主机把 HTTPS 配好,而不是删响应头——删了也帮不到任何已经收到它的人。

FAQ

没有 HSTS 会扣分吗?

不扣基础分,但会挡住 A+:最高评级要求 HSTS 的 max-age 至少 180 天或已 preload。一个站点可以拿满分 100 分,但没有它仍然只是 A。

我并不拥有所有子域名,能用 HSTS 吗?

可以,只要不加 includeSubDomains。这样这个头只对下发它的那个确切主机生效。

继续阅读