HSTS (HTTP 严格传输安全)
约 4 分钟阅读
最后更新: 2026-02-18
什么是 HSTS
HSTS (HTTP Strict Transport Security) 是一种安全机制,Web 服务器通过它指示浏览器「今后访问此域名必须使用 HTTPS」。通过在 HTTP 响应头中添加 Strict-Transport-Security 来启用。
未设置 HSTS 时,用户访问 http://example.com 时,在服务器重定向到 HTTPS 之前的短暂瞬间,通信以明文进行。这一瞬间可能遭受中间人攻击 (SSL 剥离)。设置 HSTS 后,浏览器在发送请求前就将 HTTP 改写为 HTTPS,从根本上消除了这种攻击。
HSTS 的配置与指令
HSTS 通过以下响应头配置。
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
- max-age:浏览器记住 HSTS 策略的秒数。推荐值为 31536000 (1 年)。初次部署时从 300 (5 分钟) 或 86400 (1 天) 开始,确认无问题后逐步延长。
- includeSubDomains:将 HSTS 也应用于子域名。启用前需确认
api.example.com、cdn.example.com等所有子域名都支持 HTTPS。仅使用 HTTP 的子域名将无法访问。 - preload:表示有意注册到 HSTS Preload 列表的标志。仅此标志不会注册到 Preload 列表,需要另行申请。
在安全头中,HSTS 的副作用相对较少,能可靠地强制通过 TLS/SSL 进行加密通信,因此已支持 HTTPS 的站点应尽早部署。
HSTS Preload 列表的工作原理
普通 HSTS 存在「首次访问问题」。由于浏览器在首次 HTTPS 访问时才接收 HSTS 头,用户首次访问该域名时 HSTS 不起作用。
HSTS Preload 列表解决了这个问题。它是硬编码在浏览器中的 HSTS 支持域名列表,可以通过 Chrome 管理的 hstspreload.org 提交申请。注册后,即使用户从未访问过该域名,也会从第一次访问起强制使用 HTTPS。
Preload 列表注册要求:
- 使用有效的数字证书
- 已配置 HTTP 到 HTTPS 的重定向
max-age为 31536000 (1 年) 以上- 包含
includeSubDomains和preload指令
注意,从 Preload 列表中移除需要数月时间。注册前请仔细确认所有子域名都支持 HTTPS。
HSTS 部署注意事项与渐进式方法
HSTS 虽然强大,但配置错误可能导致站点无法访问。推荐以下渐进式方法。
- 步骤 1:设置
max-age=300(5 分钟),确认整个站点在 HTTPS 下正常运行 - 步骤 2:延长到
max-age=86400(1 天),运行约一周确认无问题 - 步骤 3:扩展到
max-age=31536000; includeSubDomains - 步骤 4:根据需要添加
preload并申请 Preload 列表
特别需要注意的情况:如果 CDN 或第三方服务通过 HTTP 分发资源,HSTS 应用后会出现混合内容 (Mixed Content) 错误。部署前请确认所有外部资源都通过 HTTPS 分发。
与 CSP 的 upgrade-insecure-requests 指令配合使用,可以自动将页面内的 HTTP 资源引用改写为 HTTPS,缓解过渡期间的混合内容问题。
常见误解
- 已经重定向到 HTTPS 就不需要 HSTS
- HTTP 到 HTTPS 重定向期间,初始请求以明文发送。这一瞬间可能遭受中间人攻击 (SSL 剥离)。HSTS 在浏览器端将 HTTP 请求改写为 HTTPS,防御了重定向无法防止的攻击。
- 设置 HSTS 后立即对所有用户生效
- 普通 HSTS 在浏览器接收到头后才生效,因此首次访问时不受保护。要从首次访问起保护所有用户,需要注册到 HSTS Preload 列表。