HSTS头部配置:提升HTTPS安全性的关键一步

2026-07-21 1 阅读 SSL证书部署
SSL证书部署
HSTS头部配置:提升HTTPS安全性的关键一步

SSL证书装好了,HTTPS也跑起来了,是不是就万无一失了?还差一步。用户在浏览器里输入你的域名时,默认走的是HTTP。虽然你的服务器会301跳转到HTTPS,但在这个跳转发生之前,HTTP请求已经发出去了。如果有人在网络链路上做了手脚,这个最初的HTTP请求就可能被劫持。

HSTS(HTTP Strict Transport Security)就是来解决这个问题的。它通过一个响应头告诉浏览器:这个域名以后都用HTTPS访问,别再用HTTP了。浏览器记住之后,下次用户输入域名,浏览器直接用HTTPS发起请求,跳过那个危险的HTTP环节。

HSTS头部怎么配

在Nginx的HTTPS server块里加一行:add_header Strict-Transport-Security “max-age=31536000; includeSubDomains“ always。max-age是有效期,31536000秒等于一年。includeSubDomains表示这个规则对所有子域名也生效。always参数确保即使返回错误页面(比如404)也带上这个头。

Apache环境在.htaccess或虚拟主机配置里加:Header always set Strict-Transport-Security “max-age=31536000; includeSubDomains“。

配置前必须确认的三件事

第一,全站必须已经完成HTTPS迁移。HSTS一旦生效,浏览器会拒绝用HTTP访问你的任何页面。如果还有子域名没装证书,用户直接打不开了。所以先确保所有子域名都有有效的SSL证书。

第二,先用短时间测试。第一次配置不要直接上max-age=31536000。先用max-age=300(5分钟)跑两天,确认没有问题再逐步加大到31536000。一旦设了长有效期,发现问题想撤回,得等max-age过期或者用户手动清除浏览器缓存。

第三,检查是否有混合内容。如果HTTPS页面里还加载了HTTP的图片、CSS或JS,HSTS生效后这些资源会被浏览器直接拦截,页面布局直接崩掉。先把混合内容问题解决干净,再开HSTS。

preload列表:终极防护

HSTS有一个硬伤:用户第一次访问时还是会走HTTP。因为浏览器还没记住你的HSTS策略。解决这个问题的办法是把域名提交到HSTS preload列表。这是一个内置在所有主流浏览器里的名单,上榜的域名会被浏览器硬编码为永远使用HTTPS。

提交条件比较严格:max-age至少31536000、必须包含includeSubDomains、必须有preload指令。满足条件后到hstspreload.org提交申请,审核通过后下次浏览器更新就会内置你的域名。

但要想清楚再提交:一旦进入preload列表,撤销非常困难,可能需要数月才能从列表中移除。所以只适合已经稳定运行HTTPS且确定不会回退到HTTP的网站。

HSTS配置虽小,但它是HTTPS安全链条的最后一环。没有它,你的SSL证书部署就留了一个缝;配上它,中间人攻击的路才算真正堵死。