测试HSTS需三步:一查chrome://net-internals/#hsts确认策略已缓存且max-age>0;二测http://域名是否自动跳转HTTPS且Network无HTTP请求;三用curl和SSL Labs交叉验证响应头、TLS版本及子域HTTPS可用性。

测试 Nginx 网站的 HSTS 策略是否符合安全标准,不能只看响应头有没有发出去,关键在于验证浏览器是否真正执行了强制 HTTPS、是否缓存策略、是否抵御降级攻击。实际操作分三步走:查策略状态、测拦截行为、验全链路合规性。
一、确认 HSTS 策略已正确加载并被浏览器记住
这是所有后续测试的前提。HSTS 头必须通过 HTTPS 响应发出,且带 always 参数,否则 404/500 等状态码下不会生效。
- 在 Chrome 或 Edge 中访问 chrome://net-internals/#hsts,输入你的域名(如 example.com),点击 Query
- 若显示 Found 且 max-age > 0,说明策略已缓存;若为 Not found,先检查 Nginx 配置是否写在
listen 443 ssl块内,并执行nginx -t && nginx -s reload - Firefox 和 Safari 不提供图形界面查询,但行为与 Chromium 一致——用 Chrome 确认后,可直接在另两个浏览器中做行为验证
二、验证防降级拦截是否真实生效
HSTS 的核心价值是阻止中间人对 HTTP 请求的劫持。真正的生效表现是:用户输入 http://example.com,浏览器根本不发 HTTP 包,而是自动改写为 HTTPS 并直连。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 关闭所有该域名的标签页,清空 DNS 缓存(
ipconfig /flushdns或sudo dscacheutil -flushcache) - 在地址栏完整输入
http://example.com(注意必须带http://前缀),按回车 - ✅ 正确现象:地址栏瞬间变为
https://example.com,Network 面板中无任何 HTTP 请求记录 - ❌ 异常现象:出现“不安全”提示、301 跳转过程可见、或 Network 中出现明文 HTTP 请求 —— 说明 HSTS 未生效或被绕过
三、交叉验证响应头与全链路安全配置
仅浏览器行为还不够,需结合工具确认响应头内容、证书链、跳转逻辑是否构成完整防御闭环。
- 用
curl -I https://example.com检查响应头,确认含Strict-Transport-Security: max-age=31536000; includeSubDomains; preload(若启用 preload) - 用 SSL Labs Test 扫描域名,报告中必须同时满足:
- Overall Rating 达到 A+
- No HSTS header 项为绿色 ✔️(非红色警告)
- Protocol Support 仅显示 TLS 1.2/TLS 1.3,无 TLS 1.0/1.1
- Handshake Simulation 对 Chrome/Firefox/iOS Safari 全部显示 Yes
- 特别注意:
includeSubDomains启用前,确保所有子域(如 api.example.com、cdn.example.com)均已部署有效 HTTPS,否则将导致子域完全不可访问










