HSTS安全加固需验证响应头生效、浏览器策略落地、HTTPS全链路闭环及预加载条件。须检查主站与子域HSTS头、非2xx响应携带、客户端缓存、HTTP跳转、CDN透传,并满足hstspreload.org全部硬性要求。

生产环境中 HSTS 的安全加固评级不能只看配置是否“写了”,而要看它是否真正生效、是否符合浏览器强制策略要求、是否与整个 HTTPS 闭环协同工作。测试目标不是“有没有头”,而是“浏览器会不会锁死 HTTP 访问”“策略会不会被绕过”“预加载是否可提交”。
验证 HSTS 响应头是否正确返回
这是最基础的一步,但必须覆盖多种响应场景:
- 用
curl -I https://your-domain.com检查主站首页,确认响应头中包含Strict-Transport-Security,且值为max-age=31536000; includeSubDomains; preload(若已启用) - 对非 2xx 响应也要验证:访问一个不存在的路径(如
/404-test),执行curl -I https://your-domain.com/404-test,确保 HSTS 头依然存在——这验证了always参数是否生效 - 检查子域(如
api.your-domain.com)是否也返回相同 HSTS 头,特别是启用了includeSubDomains时,子域必须独立携带完整策略,否则预加载审核会失败
确认浏览器端是否实际应用策略
服务端发了头 ≠ 浏览器记住了。需在真实客户端验证策略落地效果:
- 在 Chrome 或 Edge 中打开
chrome://net-internals/#hsts - 在 “Query domain” 输入你的主域名(如
your-domain.com),点击 Query;若返回Found,说明已成功写入本地 HSTS 缓存,并显示当前max-age和includeSubDomains状态 - 尝试手动输入
http://your-domain.com—— 浏览器应自动跳转到 HTTPS,且地址栏不出现“不安全”提示;若仍能打开 HTTP 页面,说明 HSTS 未生效或被覆盖
检查 HTTPS 全链路闭环是否完整
HSTS 本身不解决首次 HTTP 请求问题,必须依赖 80 端口跳转堵住入口:
- 执行
curl -I http://your-domain.com,确认返回状态码为301 Moved Permanently,且Location头指向https://your-domain.com/(含完整路径) - 检查跳转是否干净:不经过中间重写、不丢失
$request_uri、不拼接错误 host;避免用rewrite,坚持用return 301 - 若使用 CDN(如 Cloudflare),确认其未过滤或覆盖 HSTS 头;部分 CDN 默认不透传自定义响应头,需在控制台显式开启
Strict-Transport-Security透传
评估是否满足 HSTS 预加载提交条件
如果目标是进入 Chromium、Firefox、Safari 的预加载列表(即“第一次访问就强制 HTTPS”),必须通过官方校验:
- 访问 hstspreload.org,输入域名进行自动检测
- 系统会检查:全站 301 到 HTTPS、
max-age ≥ 31536000、含includeSubDomains、所有子域响应头含完整 HSTS、无 HTTP 回退路径等共 10+ 项硬性条件 - 任一子域(如
cdn.your-domain.com)证书过期、响应超时或缺失 HSTS 头,都会导致整体失败;建议先用max-age=300灰度一周,再逐步升级


















