什么是HSTS?
HSTS(HTTP Strict Transport Security,HTTP 严格传输安全)是一种由服务器通过响应头下发、由浏览器执行的 HTTPS 强制策略,用于消除站点部署 HTTPS 之后仍然存在的明文降级风险。
它与 SSL/TLS 证书协同工作:证书负责身份验证与加密传输,HSTS 负责把"必须走 HTTPS"固化为浏览器侧的强制规则,阻断 SSL 剥离攻击。
很多网站部署 HTTPS 之后,会觉得安全问题到此为止了。实际不是。用户第一次访问时如果从 http:// 开头——比如直接输入域名、点开别人发来的明文链接——浏览器会先发一个 HTTP 请求,再由服务器或中间人跳转到 HTTPS。这个跳转前的瞬间,就是攻击窗口。
一、HSTS 要解决的是 SSL 剥离攻击
攻击者站在用户和服务器之间,把用户的 HTTP 请求原样转发,自己跟服务器保持 HTTPS。用户这边看到的是正常页面,地址栏却不带锁,输入的任何内容都是明文。这种攻击叫 SSL 剥离(SSL Stripping),难点在于它发生在证书验证之前,服务器端完全感知不到——从服务器视角看,一切请求都正常。
HSTS 就是用来关掉这个窗口的。机制不复杂:服务器在 HTTPS 响应里带一个 Strict-Transport-Security 头,浏览器收到后把这个域名记为"强制 HTTPS",过期之前,用户访问该域名一律直接走 HTTPS,连发 HTTP 请求的机会都不给。核心变化是,要不要用加密这件事,不再由用户或中间人决定,由服务器策略说了算。
二、响应头三个参数,各自管什么
配置本身只有一行:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age 是强制时长,单位秒,31536000 等于一年。实际部署中不建议一上来就拉满,先用短周期(比如 86400,一天)跑一段,确认没有异常再逐步加长。原因在于 HSTS 生效后,浏览器不会给用户"降级到 HTTP"的选择,一旦出问题,排查窗口会比较被动。
includeSubDomains 把策略扩展到所有子域名。开不开,取决于子域名的现状:所有子站都已经走 HTTPS,开了没坏处;还有子站跑着 HTTP 接口,开了之后这些访问会被浏览器直接拦截。常见情况是主站切完了、子站忘了,一开 includeSubDomains 才发现。
preload 是把域名提交进浏览器内置的预加载列表,是目前解决首次访问降级风险的主要方式之一。普通 HSTS 头只对访问过站点的浏览器生效,preload 让第一次访问也直接走 HTTPS。代价是提交和撤下都困难,提交前要想清楚。
三、部署配置与验证
Nginx:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
always 参数别省。Nginx 的 add_header 默认只在 200、201、204、206、301、302、303、304、307、308 这些状态码上输出,404、500 之类的响应不会带这个头——用户访问一个不存在的页面拿不到 HSTS 头,强制策略就出现了漏洞窗口。
Apache:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
IIS 在 web.config 的 system.webServer > httpProtocol > customHeaders 里添加同名响应头。
部署完用 curl 验证:
curl -I https://example.com
返回头里能看到 Strict-Transport-Security 就说明已生效,也可以用证书和响应头检测工具核对 max-age 和 includeSubDomains 是否按预期下发。
四、上线前要权衡的几件事
- 证书必须完全可用。HSTS 生效后,浏览器遇到证书错误会直接拒绝访问,不给"继续前往"的选项。证书没装对、快过期,都会让站点彻底不可达。所以 HSTS 是 HTTPS 完全稳定之后才做的事情,证书本身要先装好,证书装进服务器的操作步骤可以参考。
- preload 慎提交。浏览器厂商更新列表有周期,撤下来要等很久。站点还没完全切好 HTTPS 时别提交,否则期间所有访问都被强制加密。
- 想清楚 CDN 这一层。很多站点走 CDN,HSTS 头可以在源站配,也可以在 CDN 层配,两者都配时以 CDN 返回的为准。启用前先确认 CDN 是否透传或覆盖该响应头。
- HSTS 不负责证书可信度。强制 HTTPS 之后浏览器仍然会校验证书,遇到证书链、域名不匹配之类的报错,排查方向还是证书本身,可以对照证书报错时从哪几个方向排查。
五、常见问题解答
Q:HSTS 和 HTTPS 是什么关系? HTTPS 是加密传输本身,HSTS 是强制使用 HTTPS 的策略。没有证书,HSTS 无从谈起。
Q:max-age 设多长合适? 从一天起步,稳定后加到一年。想提交 preload 的话,列表要求至少一年。
Q:加不加 includeSubDomains? 所有子域名都走 HTTPS 就加;还有 HTTP 子服务就先不加,避免子站被浏览器拦截。
Q:HSTS 能防止证书过期导致的报错吗? 不能。证书过期时浏览器照样报错,HSTS 站点会直接拒绝访问,证书续期还是要靠自己的监控。
HSTS 把"访问站点必须加密"从浏览器的默认行为变成了服务器的强制要求,配合 TLS 协商和证书验证,封死了 HTTPS 部署后残留的降级通道。它解决的是策略问题,加密由证书负责:
证书证明站点可信,HSTS 保证用户没有机会绕开加密。部署上先把证书、全站 HTTPS、子域名现状确认清楚,再谈 max-age 和 preload,顺序反了会把自己锁在门外。



京公网安备11010502031690号
网站经营企业工商营业执照
















