HSTS preload 的 max-age 要求到底是什么?
HSTS(HTTP Strict Transport Security)preload 是浏览器内置的一个机制,让支持 HTTPS 的网站在用户第一次访问时就能强制走 HTTPS,而不需要先经历一次 HTTP 到 HTTPS 的跳转。
在提交到 hstspreload.org 时,官方对 Strict-Transport-Security 响应头有一个硬性要求:
max-age 必须 ≥ 31536000(1年),同时建议设置为 63072000(2年)。
这就是「两年」这个说法的来源。但它到底是强制要求,还是建议值?很多站长在这里被搞糊涂了。
两年(63072000秒)是硬要求吗?
直接说结论:不是硬要求,但强烈建议设置为两年。
根据 hstspreload.org 的官方提交检查规则:
- 最低要求:max-age ≥ 31536000(秒)= 1年
- 建议值:max-age = 63072000(秒)= 2年
- 必须同时携带:includeSubDomains 和 preload 指令
所以,如果你设置 max-age=31536000(刚好一年),提交时不会被拒绝,但会看到一个警告提示,建议你提升到两年。
如果你的 max-age 小于 31536000,提交会直接被拒绝,报错类似:
Error: The max-age must be at least 31536000.
提交时被拒绝:max-age 不够会怎样?
实际提交时,hstspreload.org 会先爬取你的域名,检查响应头是否符合规范。常见的被拒原因和 max-age 相关的有:
| 问题 | 报错信息 | 解决方法 |
|---|---|---|
| max-age < 31536000 | max-age must be at least 31536000 | 将 max-age 改为 31536000 或更大 |
| 缺少 includeSubDomains | includeSubDomains is required | 在响应头中加上 includeSubDomains |
| 缺少 preload 指令 | preload is required | 在响应头末尾加上 preload |
| HTTPS 跳转后才带 HSTS 头 | HSTS header not present on HTTP response | 确保 HTTP 和 HTTPS 都返回 HSTS 头 |
正确的上线策略:从测试值到正式值
直接把 max-age 设为两年是很危险的。如果某天你的 HTTPS 证书过期了,或者需要回退到 HTTP(虽然不推荐),浏览器会强制记住这个站点只能用 HTTPS,最长两年,导致用户完全无法访问。
正确的分阶段策略:
阶段一(测试):max-age=300 → 5分钟,验证 HSTS 是否生效,浏览器是否出现跳转异常 阶段二(延长):max-age=86400 → 1天,观察 CDN / 代理层是否有异常 阶段三(接近正式):max-age=31536000 → 1年,满足 preload 最低要求,提交 preload 列表 阶段四(正式):max-age=63072000 → 2年,符合官方建议,长期稳定
实战配置:分阶段部署方案
Nginx 配置示例
# 阶段一:测试用(5分钟) add_header Strict-Transport-Security "max-age=300" always; # 阶段二:观察用(1天) add_header Strict-Transport-Security "max-age=86400; includeSubDomains" always; # 阶段三:满足 preload 要求(1年) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # 阶段四:正式生产(2年) add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
注意:每个阶段稳定运行一段时间后再进入下一阶段,不要跳过。
Apache 配置示例
# 正式生产环境 Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
常见误区澄清
误区一:「preload 列表里的 max-age 必须是 63072000」
不对。preload 列表只要求 ≥ 31536000。设置为 63072000 是官方建议,不是强制。
误区二:「我设置了 preload,max-age 就会自动变成两年」
不对。max-age 的值完全由你自己的服务器响应头决定,preload 列表只是让浏览器在第一次访问前就知道这个域名必须用 HTTPS。
误区三:「max-age 设得越大越好」
有一定道理,但要权衡风险。max-age 越大,一旦 HTTPS 出问题,影响时间越长。两年是一个在安全性和灵活性之间比较平衡的值。
总结
- HSTS preload 要求 max-age ≥ 31536000(1年),不是必须两年
- 63072000(2年)是官方建议值,设置为两年可以避免 hstspreload.org 的警告
- 不要直接上两年,分阶段测试:300 → 86400 → 31536000 → 63072000
- 提交 preload 前,确保 includeSubDomains 和 preload 指令都已就位
内链参考:
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论