Web 安全

HSTS (HTTP 严格传输安全)

约 4 分钟阅读

什么是 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.comcdn.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 年) 以上
  • 包含 includeSubDomainspreload 指令

注意,从 Preload 列表中移除需要数月时间。注册前请仔细确认所有子域名都支持 HTTPS。

HSTS 部署注意事项与渐进式方法

HSTS 虽然强大,但配置错误可能导致站点无法访问。推荐以下渐进式方法。

  1. 步骤 1:设置 max-age=300 (5 分钟),确认整个站点在 HTTPS 下正常运行
  2. 步骤 2:延长到 max-age=86400 (1 天),运行约一周确认无问题
  3. 步骤 3:扩展到 max-age=31536000; includeSubDomains
  4. 步骤 4:根据需要添加 preload 并申请 Preload 列表

特别需要注意的情况:如果 CDN 或第三方服务通过 HTTP 分发资源,HSTS 应用后会出现混合内容 (Mixed Content) 错误。部署前请确认所有外部资源都通过 HTTPS 分发。

CSPupgrade-insecure-requests 指令配合使用,可以自动将页面内的 HTTP 资源引用改写为 HTTPS,缓解过渡期间的混合内容问题。

常见误解

已经重定向到 HTTPS 就不需要 HSTS
HTTP 到 HTTPS 重定向期间,初始请求以明文发送。这一瞬间可能遭受中间人攻击 (SSL 剥离)。HSTS 在浏览器端将 HTTP 请求改写为 HTTPS,防御了重定向无法防止的攻击。
设置 HSTS 后立即对所有用户生效
普通 HSTS 在浏览器接收到头后才生效,因此首次访问时不受保护。要从首次访问起保护所有用户,需要注册到 HSTS Preload 列表。
分享

相关术语