HTTP 严格传输安全 (HTTP Strict Transport Security)
字数 2497 2025-12-04 16:30:35
HTTP 严格传输安全 (HTTP Strict Transport Security)
第一步:定义与核心概念
HTTP 严格传输安全,简称 HSTS,是一种由 IETF 标准化的网络安全策略机制。它的核心功能是强制 Web 浏览器和应用程序只通过安全的 HTTPS 连接与指定网站进行通信,完全禁止不安全的 HTTP 连接。它不是一个独立的协议,而是一个通过 HTTP 响应头 Strict-Transport-Security 来传达和执行的策略。
第二步:解决的根本问题——“SSL剥离攻击”
要理解 HSTS 的价值,必须先理解它旨在解决的特定威胁:SSL/TLS 剥离攻击。
- 理想流程:用户首次在浏览器地址栏输入
http://example.com或直接输入域名。一个安全的网站通常会通过“301/302 重定向”将这次 HTTP 请求跳转到 HTTPS 版本(https://example.com),后续通信都基于加密的 HTTPS。 - 攻击场景:攻击者(例如,在同一不安全的公共 Wi-Fi 网络中)可以劫持用户首次发出的那个纯文本的 HTTP 请求。攻击者拦截来自服务器的重定向指令,阻止它到达用户浏览器,从而让用户浏览器始终停留在不加密的 HTTP 连接上与攻击者控制的服务器通信。这样,所有流量(包括登录凭证、Cookie 等)都以明文形式暴露给攻击者。
- 问题根源:第一次的 HTTP 请求是脆弱的,因为重定向到 HTTPS 这一行为本身是通过不安全的 HTTP 通道传达的。
第三步:HSTS 的工作原理与机制
HSTS 通过以下机制从根源上切断上述攻击路径:
- 策略声明:网站在通过 HTTPS 连接返回的响应中,包含一个
Strict-Transport-Security响应头。例如:Strict-Transport-Security: max-age=31536000; includeSubDomains。 - 浏览器策略存储:当浏览器收到这个响应头并验证当前连接确实是 HTTPS 后,它会将这个策略存储在本地(例如,在一个“HSTS 预加载列表”或独立的策略缓存中)。策略内容包括:域名、过期时间(
max-age,以秒为单位)、是否包含子域名(includeSubDomains)。 - 策略强制执行:在策略有效期内,当用户尝试访问该网站时:
- 如果用户输入
http://example.com,浏览器会在内部自动、静默地将请求升级为https://example.com后再发出,用户根本不会接触到不安全的 HTTP 连接。 - 如果网站的 HTTPS 证书无效(如过期、域名不匹配),浏览器会显示不可绕过的警告(因为传统的 HTTP 回退路径被 HSTS 策略禁止了),用户无法点击“继续前往不安全网站”。
- 如果设置了
includeSubDomains,此策略将应用于该域名下的所有子域名。
- 如果用户输入
第四步:首次访问的“信任启动”问题与“HSTS 预加载列表”
HSTS 策略只在浏览器成功通过 HTTPS 访问过一次网站后才会生效。那么,用户的第一次访问(或者清空浏览器缓存后的访问)仍然面临 SSL 剥离攻击的风险。为解决这个“信任启动”问题,主流浏览器维护了一个 HSTS 预加载列表。
- 列表内容:这是一个硬编码在浏览器代码或定期更新的列表,包含了大量承诺只使用 HTTPS 的知名网站域名。
- 工作方式:浏览器在出厂或更新时,就内置了这些域名的 HSTS 策略。即使用户从未访问过
https://example.com,只要该域名在预加载列表中,浏览器在首次访问时就会直接强制使用 HTTPS。 - 网站申请加入:网站所有者可以通过满足一系列严格条件(如全站 HTTPS、支持
includeSubDomains指令、提供有效的重定向等),并向浏览器厂商(如 Chrome、Firefox)提交申请,将其域名加入这个全局列表。
第五步:响应头指令详解
Strict-Transport-Security 响应头包含以下主要指令:
max-age=<seconds>:必需。指定 HSTS 策略在浏览器中缓存的时间。31536000秒代表一年,是推荐值。includeSubDomains:可选。指示此策略适用于该域名及其所有子域名。例如,对example.com设置此指令后,访问http://blog.example.com或http://api.example.com也会被强制升级到 HTTPS。preload:可选,但用于预加载提交。这是一个信号,表明网站所有者希望被纳入浏览器的 HSTS 预加载列表。仅仅在响应头中添加preload并不会自动加入列表,仍需通过官方渠道提交申请。
第六步:部署注意事项与最佳实践
- 先决条件:网站在启用 HSTS 之前,必须确保所有页面和资源(CSS、JS、图片等)都能通过 HTTPS 无错误访问。
- 渐进部署:建议从较小的
max-age(如 300 秒/5分钟)开始测试,逐步增加,确保没有遗留的 HTTP 链接或依赖项。 - 谨慎使用
includeSubDomains:启用前,必须确认所有子域名都已完全支持 HTTPS。一个不支持 HTTPS 的子域名会被 HSTS 策略锁定,导致用户无法访问。 - 无法轻易回退:一旦 HSTS 策略被浏览器接收并缓存(尤其当它被加入预加载列表后),在
max-age过期前,无法撤销。如果网站因故需要回退到 HTTP,已缓存该策略的用户将无法访问。
总结:HSTS 是一种“一次设置,自动保护”的强制 HTTPS 策略。它通过声明、缓存和强制执行三个步骤,有效抵御了 SSL 剥离攻击,并借助预加载列表解决了首次访问的安全漏洞,是构建现代安全 Web 应用不可或缺的一环。