HSTS配置指南:强制HTTPS杜绝HTTP跳转
什么是HSTS?
HSTS(HTTP Strict Transport Security,HTTP严格传输安全)是一种Web安全策略机制。它允许网站在服务器端通过响应头告知浏览器:在指定时间内,该域名只能通过HTTPS协议进行访问,而任何尝试使用HTTP协议的请求都会被浏览器自动改写为HTTPS请求,从而杜绝因HTTP明文传输带来的劫持、篡改和中间人攻击风险。
为什么需要HSTS?
通常情况下,网站即使配置了HTTPS证书,用户仍可能在地址栏手动输入域名或点击旧链接时,先发起HTTP请求,再由服务器或客户端进行301/302跳转到HTTPS。整个跳转过程存在一个窗口期:首次请求仍为明文HTTP,攻击者可利用该窗口实施降级攻击、窃取敏感信息。HSTS解决的根本问题,就是让浏览器在策略生效期间内,强制跳过HTTP请求,直接使用HTTPS。
HSTS工作原理
当服务器响应头中包含 Strict-Transport-Security 字段时,浏览器会记录该域名的HSTS策略,并存储于本地。后续在策略有效期内,用户访问该域名时,浏览器会在内部将URL改写为HTTPS,不再发起任何HTTP请求。
- 用户首次访问HTTPS页面,服务器返回HSTS响应头。
- 浏览器解析并存储HSTS策略,包括有效期和是否覆盖子域名。
- 在有效期内,浏览器对所有指向该域名的HTTP请求进行自动重写为HTTPS。
- 即使证书出现无效或过期,浏览器也不会自动降级为HTTP,而是显示安全错误。
如何配置HSTS
配置HSTS的核心是添加HTTP响应头。以主流Web服务器为例:
Nginx配置
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
其中 max-age 表示策略有效期(秒),建议至少180天(15552000秒),行业推荐值为1年(31536000秒)。includeSubDomains 表示该策略同时适用于所有子域名。若准备提交HSTS预加载列表,则需带上 preload 指令。
Apache配置
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
CDN/云负载均衡配置
若网站使用CDN或云负载均衡,通常可在控制台的自定义HTTP头中直接添加同样的字段。请确认源站和CDN均支持HTTPS回源,否则可能出现循环重定向。
HSTS预加载(Preload)
HSTS策略默认依赖首次HTTPS访问后浏览器存储响应头,但第一次访问仍可能走HTTP。为解决这一缺陷,可通过向 hstspreload.org 提交域名,将域名加入浏览器内置的HSTS预加载列表。一旦审核通过,浏览器在未来所有版本中都会直接强制HTTPS,无需首次访问。提交预加载需满足以下条件:
- 有效的SSL/TLS证书(所有子域名也必须有效)。
- 所有HTTP请求必须301/302重定向到HTTPS。
- 根域名和所有子域名都必须启用HTTPS。
- HSTS响应头包含
preload指令,且max-age至少为31536000秒。 - 需要托管完整的子域名(如
www、m等),且为它们配置了有效的HTTPS证书。
注意:一旦成功加入预加载列表,极难移除,且策略不可撤销,因此需严格确认子域名均支持HTTPS后再提交。
配置HSTS的注意事项
- 确保所有子域名已开启HTTPS并拥有有效证书,避免因includeSubDomains导致子域名访问被强制HTTPS后因证书错误而不可用。
- 建议先在测试环境启用
max-age较短(如600秒),验证无误后再调大,避免因配置错误造成长时间不可访问。 - HSTS响应头必须通过HTTPS响应发送,不能通过HTTP发送,否则会被浏览器忽略。
- 若配置了CDN或WAF,需在边缘节点同时添加该响应头,否则源站的HSTS头可能被剥离。
- 不要在未完全过渡HTTPS的保守站点上过早使用
includeSubDomains或preload指令。
总结
HSTS是提升网站安全性的重要手段,它可以杜绝HTTP明文请求,防止中间人攻击和降级劫持。只要合理规划子域名和证书,并通过预加载进一步消除“首次访问”鸿沟,就能让浏览器完全强制HTTPS,保障用户数据安全。建议所有已部署HTTPS的站点,优先启用HSTS并配置合理的策略头。