
快速总结: HSTS是一个HTTP响应头,指示浏览器始终使用HTTPS——永久防止SSL剥离和降级攻击,即使在不受信任的Wi-Fi网络上也是如此。
什么是HSTS?
HSTS代表HTTP严格传输安全。这是通过名为Strict-Transport-Security的HTTP响应头传递的网络安全策略。浏览器一旦收到此头部,就会记住该网站必须始终通过HTTPS访问,并在max-age周期内自动拒绝对该域的任何HTTP连接。
简单来说:即使用户输入http://yourdomain.com,浏览器也会在请求离开设备之前将其转换为https://——让攻击者无机会拦截连接。
为什么仅HTTPS还不够?
仅拥有SSL证书无法完全保护用户免受SSL剥离攻击。在SSL剥离攻击中,中间人在重定向到HTTPS之前拦截初始HTTP连接,然后静默地代理流量。用户看到HTTP而攻击者通过HTTPS与服务器通信。
这种攻击在公共Wi-Fi上特别有效——机场、咖啡馆、酒店——用户很少检查地址栏中的协议。
HSTS完全消除了这个窗口:浏览器根本不会发送HTTP请求。
HSTS如何工作
当浏览器首次通过HTTPS连接到启用HSTS的网站时,服务器会发送回如下所示的头部:
浏览器存储此策略,意思是:
- max-age=31536000 — 记住此项1年(31,536,000秒)
- includeSubDomains — 此策略也适用于所有子域
在接下来的一年里,对http://yourdomain.com的任何请求都会由浏览器本身自动升级到https://——无需往返服务器。
在Apache上启用HSTS(.htaccess)
对于使用Apache的虚拟主机客户(如DirectAdmin上的AsiaGB虚拟主机),将以下内容添加到您的.htaccess文件:
要包含HSTS预加载(下面解释):
重要提示: 仅在SSL证书完全工作后才启用HSTS。如果HSTS激活时SSL过期或出现问题,用户将完全被锁定,直到max-age过期。
在Nginx上启用HSTS
对于运行Nginx的VPS用户,在您的服务器块内添加此指令:
在WordPress上启用HSTS
WordPress用户可以通过Really Simple SSL插件或Wordfence Security启用HSTS——两者在设置面板中都有切换开关。或者,任何允许您设置自定义HTTP头的插件都可以工作。
什么是HSTS预加载?
标准HSTS有一个限制:在首次访问网站时(浏览器看到HSTS头之前),仍然存在一个简短的漏洞窗口。HSTS预加载通过将您的域直接嵌入到随Chrome、Firefox、Safari和Edge一起提供的列表中来消除这个问题。
要在hstspreload.org申请HSTS预加载,您的网站必须:
- 为所有子域提供有效的SSL证书
- 将所有HTTP流量重定向到HTTPS(包括子域)
- 提供HSTS头,其
max-age至少为31536000 - 同时包括
includeSubDomains和preload指令
启用HSTS前的关键警告
- SSL必须始终有效 — HSTS激活时过期或损坏的证书意味着用户无法访问。
- 所有子域都需要SSL — 如果您包含
includeSubDomains但某个子域缺少证书,它将无法访问。 - 从短的max-age开始 — 从
max-age=300(5分钟)开始测试,然后逐步增加到1年。 - HSTS预加载很难撤销 — 从预加载列表中移除需要数月才能传播。
如何验证HSTS是否激活
方法1 — 浏览器开发工具: 按F12 → 网络标签 → 点击第一个请求 → 检查响应头中的Strict-Transport-Security。
方法2 — 在线检查器: 访问securityheaders.com并输入您的域以查看您的安全头等级。
方法3 — Chrome HSTS管理器: 导航到chrome://net-internals/#hsts并查询您的域以查看Chrome是否已存储其HSTS策略。
选择正确的max-age值
您选择的max-age直接控制安全性和灵活性之间的平衡。太短则会失去保护;太长则SSL证书出现问题会锁定所有访问者。下表有助于您为您的阶段选择正确的值。
| max-age(秒) | 等效值 | 最适合 | 如果SSL出现问题的恢复时间 |
|---|---|---|---|
| 300 | 5分钟 | 初始测试 | 5分钟——非常宽容 |
| 86400 | 1天 | 过渡期 | 最多1天 |
| 2592000 | 30天 | 自信的生产网站 | 最多30天 |
| 31536000 | 1年 | 标准生产 | 最多1年——SSL必须永远不过期 |
| 63072000 | 2年 | 预加载提交 | 非常难以撤销 |
HSTS和您的网站安全评分
除了阻止攻击,HSTS还改善了您网站在多个评估框架中的安全评分。工具如securityheaders.com在HSTS与Content-Security-Policy、X-Frame-Options和Referrer-Policy等补充头部一起出现时会颁发A或A+等级。Google还会将安全信号纳入其爬取和排名评估中。
对于处理支付数据的电子商务或任何网站,HSTS是PCI DSS(支付卡行业数据安全标准)要求的一部分。合规要求HTTP连接被永久阻止——HSTS是在浏览器级别强制执行此操作的正确技术机制,无需仅依赖服务器端重定向。
如果您使用dnsxray.com之类的工具对您的域进行安全头部检查,您将看到您的服务器发送的确切HSTS头部——包括max-age值、是否设置了includeSubDomains以及您的网站是否符合预加载提交的条件。
要避免的常见HSTS错误
HSTS配置很直接,但几个常见的错误可能导致没有保护或访问者被锁定。
- 通过HTTP发送HSTS头部 — 浏览器完全忽略通过纯HTTP传递的HSTS头部。头部必须来自HTTPS响应。
- 在Apache上忘记mod_headers — 没有加载headers模块,
Header always set无效。用apache2ctl -M | grep headers验证。 - 在所有子域都有SSL之前添加includeSubDomains — 没有有效证书的任何子域对已缓存HSTS策略的浏览器立即变得无法访问。
- 删除头部以"撤销"HSTS — 仅删除头部对已缓存策略的浏览器无效。您必须提供
max-age=0来指示浏览器清除存储的条目。 - 将preload与短max-age结合 — hstspreload.org要求max-age至少为31536000。带有preload指令的短max-age将被拒绝。
总结:您应该启用HSTS吗?
如果您的网站在每个子域上都有有效的SSL证书——是的,强烈建议启用HSTS。它关闭了仅SSL无法保护的唯一剩余窗口:服务器重定向生效之前的第一个HTTP请求。
建议的路径:(1)安装受信任的SSL证书→(2)强制HTTP到HTTPS重定向→(3)添加max-age=300的HSTS头部→(4)用securityheaders.com测试→(5)逐步将max-age增加到1年→(6)当准备好时添加preload指令并提交到hstspreload.org。
从AsiaGB获取受信任的SSL证书
RapidSSL起价฿1,000/年 · GeoTrust · DigiCert · 5分钟内签发
与HSTS和HSTS预加载兼容所有主要浏览器