如果您已安装SSL证书并配置了HTTP转HTTPS的重定向,这是一个很好的起点。但仍存在一个漏洞:重定向发生前的第一次HTTP请求。攻击者可以利用这个窗口期发动SSL剥离攻击或中间人攻击。
HSTS Preload完全封堵了这个漏洞。本文将解释它是什么、如何工作,以及如何将您的域名添加到全球浏览器使用的列表中。
什么是HSTS — 基础知识
HTTP严格传输安全(HSTS)是一种Web服务器策略,通过Strict-Transport-Security响应头告知浏览器"此网站只使用HTTPS"。
浏览器收到此响应头后,会在指定时间内(max-age)记住该域名需要HTTPS。在发送任何请求前,浏览器会自动将http://升级为https://,无需联系服务器。
Strict-Transport-Security: max-age=31536000; includeSubDomainsmax-age=31536000 = 记住1年(365天)
HSTS能防御哪些攻击?
- SSL剥离攻击 — 攻击者将连接从HTTPS降级为HTTP
- 中间人攻击(MitM) — 在不安全网络上拦截用户与服务器之间的通信
- Cookie劫持 — 捕获通过HTTP传输的Cookie
- 被动监听 — 监控未加密的流量
什么是HSTS Preload及其区别
尽管HSTS效果出色,但它有一个弱点,称为首次使用信任(TOFU):浏览器必须至少通过HTTPS访问一次网站,才能记住需要强制使用HTTPS。
如果第一次访问发生在HTTP上(如输入裸域名或点击http://链接),用户在该初始连接期间仍面临风险。
HSTS Preload通过将HTTPS专用域名列表直接嵌入浏览器来解决这个问题 — 无需第一次访问,浏览器在安装之前就知道这些域名只使用HTTPS。
| 特性 | 普通HSTS | HSTS Preload |
|---|---|---|
| 需要先进行HTTPS访问 | ✅ 需要 | ❌ 不需要 |
| 保护首次访问 | ❌ 不保护 | ✅ 保护 |
| 内置于浏览器 | ❌ | ✅ 硬编码 |
| 浏览器支持 | Chrome、Firefox、Safari、Edge | Chrome、Firefox、Safari、Edge、Opera |
| 易于移除 | ✅ 容易(删除响应头) | ❌ 困难(耗时长) |
| 覆盖子域名 | 可选(includeSubDomains) | 强制(includeSubDomains) |
HSTS Preload的工作原理
Chrome维护着一个开源的HSTS预载列表,所有主流浏览器都使用这个列表。该列表以transport_security_state_static.json文件的形式嵌入浏览器源代码中。
- 网站所有者在hstspreload.org提交域名
- Chrome团队验证要求(SSL + 响应头 + 子域名)
- 域名被添加到列表并合并到Chromium源代码
- 新Chrome版本发布时,更新后的列表分发给全球用户
- Firefox、Safari和Edge使用同一份列表
提交前的必要条件
hstspreload.org要求您在提交前通过所有5个条件:
- 有效的SSL证书 — 未过期,由受信任的CA颁发
- HTTP → HTTPS重定向 — 端口80在所有情况下必须重定向到HTTPS
- HTTPS必须直接在443端口提供服务
- HTTPS上的HSTS响应头必须包含:
max-age≥ 31,536,000(1年)includeSubDomainspreload
- 所有子域名必须支持HTTPS — 例如www、mail、ftp必须有SSL证书
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
分步提交指南
第一步 — 安装SSL证书
需要在主域名和所有子域名上安装有效的SSL证书。可使用Let's Encrypt(免费)或来自受信任CA的商业证书。
第二步 — 配置HTTP → HTTPS重定向
在DirectAdmin主机上,将以下内容添加到.htaccess:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
第三步 — 添加HSTS响应头
# 在.htaccess的重定向块之后
Header always set Strict-Transport-Security \
"max-age=31536000; includeSubDomains; preload"
第四步 — 在hstspreload.org上测试
打开hstspreload.org,输入您的域名,点击检查资格(Check Eligibility)— 提交前必须通过所有条件检查。
第五步 — 提交您的域名
点击hstspreload.org上的提交(Submit)按钮,输入电子邮件以接收状态通知。
第六步 — 等待审核
Chrome团队将审核并合并到列表中 — 通常需要4-8周,大多数用户才能在新Chrome版本中收到更新。
在.htaccess中完整配置HSTS
DirectAdmin主机的完整Apache配置:
# 强制HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# HSTS响应头(准备提交时添加preload)
<IfModule mod_headers.c>
Header always set Strict-Transport-Security \
"max-age=31536000; includeSubDomains; preload"
</IfModule>
HTTPS安全级别对比
| 级别 | 配置 | 保护首次访问 | 复杂度 |
|---|---|---|---|
| 第1级 | 仅SSL证书 | ❌ | 简单 |
| 第2级 | SSL + HTTP→HTTPS重定向 | ❌ | 简单 |
| 第3级 | SSL + 重定向 + HSTS | ❌(第2次访问起保护) | 中等 |
| 第4级 ⭐ | SSL + 重定向 + HSTS Preload | ✅ | 较高 |
优势与注意事项
优势
- 从第一次访问就开始保护 — 无TOFU漏洞
- 完全防御SSL剥离攻击
- 提升网站可信度
- 符合Google安全最佳实践
- 通过高级安全审计
- 提交免费
注意事项
- 极难移除 — 效果可持续超过一年
- 每个子域名都必须有SSL — 没有SSL的子域名将无法访问
- SSL绝不能过期 — SSL过期将导致所有用户无法访问
- 开发/测试环境也需要SSL — 如果使用相同域名
如何将域名从预载列表中移除
如需移除域名,请访问hstspreload.org/removal并:
- 从服务器上的HSTS响应头中删除
preload指令 - 在hstspreload.org/removal提交移除请求
- 等待Chrome发布不含您域名的新版本
常见问题解答
HSTS Preload是硬编码在Chrome、Firefox、Edge等主流浏览器中的域名列表,强制列表中的所有域名只使用HTTPS连接,无需等待初始HTTP重定向。
普通HSTS通过服务器发送Strict-Transport-Security响应头 — 浏览器在第一次HTTPS访问后记住。而HSTS Preload从第一次访问就强制使用HTTPS,因为域名在浏览器安装前就已内置。
在hstspreload.org提交后,通常需要1-3个月,域名才会被纳入大多数用户使用的Chrome版本中。
可以,但需要很长时间 — 可能超过一年。因此在提交前请确保能长期维护HTTPS。
不是所有网站都需要。HSTS Preload适合安全要求极高的网站,如银行系统、登录系统或敏感数据平台。已有SSL证书和HTTP转HTTPS重定向的普通网站对大多数用途来说安全性已经足够。
是的 — HSTS Preload列表要求必须包含includeSubDomains指令,这样所有子域名也会自动强制使用HTTPS。
🔒 总结 — HSTS Preload
- HSTS Preload = 您的域名被硬编码在浏览器中,始终使用HTTPS
- 从第一次访问就开始保护 — 无TOFU漏洞
- 要求:有效SSL + 重定向 + HSTS响应头含max-age≥1年 + includeSubDomains + preload
- 在hstspreload.org免费提交 — 但移除困难,请提前规划
- 最适合高安全性网站,并非所有网站都必须使用