0

HSTS preload max-age必须两年吗?官方要求与分阶段配置完整指南

2026.05.30 | youres | 4次围观

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 < 31536000max-age must be at least 31536000将 max-age 改为 31536000 或更大
缺少 includeSubDomainsincludeSubDomains 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辅助作者原创,未经许可,转载请保留原文链接。

发表评论