hsts的核心作用是强制浏览器仅通过https访问网站,杜绝协议降级攻击;需确保全站https稳定、子域证书有效、tls版本合规、资源链接为https或协议相对路径,并正确配置max-age、includesubdomains和preload参数。

HSTS 的核心作用是让浏览器“记住”只能用 HTTPS 访问你的网站,从而跳过首次 HTTP 请求这个最危险的环节,直接堵死协议降级攻击的入口。配置本身不难,但关键在参数选择、部署顺序和后续验证。
必须确保全站 HTTPS 已稳定运行
启用 HSTS 前,HTTP 到 HTTPS 的 301/302 跳转必须已全部生效,且所有子域名(如 www、api、cdn)都已部署有效证书并能正常响应 HTTPS 请求。否则一旦开启 HSTS,用户访问 HTTP 地址会直接失败,无法回退。
- 检查每个子域名是否支持 TLS 1.2+,禁用 SSLv3、TLS 1.0/1.1
- 确认所有静态资源(CSS、JS、图片)链接均为 HTTPS 或协议相对路径(//)
- 使用 curl -I https://yoursite.com 验证响应头中是否含 Strict-Transport-Security
设置合理的 HSTS 响应头参数
HSTS 通过响应头生效,标准格式为:Strict-Transport-Security: max-age=31536000; includeSubDomains; preload。三项参数各有含义:
- max-age:建议从 300(5分钟)开始测试,确认无误后逐步延长;生产环境推荐 ≥ 31536000(1年),最大值即此
- includeSubDomains:若所有子域均已支持 HTTPS,务必加上;否则子域可能意外中断
- preload:仅当准备提交至浏览器预加载列表时启用;启用后无法快速撤回,需满足严格条件(如 max-age ≥ 10886400、强制 includeSubDomains 等)
在常见服务器或框架中添加响应头
不同环境添加方式略有差异,但本质都是在 HTTPS 响应中注入该 Header:
- Nginx:在 server 块中添加 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
- Apache:启用 headers 模块后,在 VirtualHost 中加 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
- Fiber(Go):使用 app.Use(func(c *fiber.Ctx) error { c.Set("Strict-Transport-Security", "max-age=31536000; includeSubDomains"); return c.Next() })
- 注意:该 Header 只能出现在 HTTPS 响应中,HTTP 响应里设置无效;也不支持在 301 重定向响应中设置
验证与后续管理
上线后不能只靠“设置了就完事”,需主动验证效果和风险边界:
- 用 chrome://net-internals/#hsts 查询域名是否已被浏览器缓存 HSTS 策略
- 用在线工具(如 securityheaders.com 或 hstspreload.org)检测 Header 是否正确返回及是否符合预加载要求
- 如需临时关闭 HSTS(例如调试 HTTP 接口),需将 max-age 设为 0 并持续返回该头至少一次,等待用户浏览器刷新缓存
- 加入预加载列表前,务必在 hstspreload.org 提交并审核通过;一旦收录,Chrome/Firefox 等会永久强制 HTTPS,即使你后来撤下 Header










