HTTP严格传输安全协议怎么玩?HSTS配置教程
- 云服务器
- 2026-07-06
- 5
HTTP 严格传输安全(HSTS, HTTP Strict Transport Security)是一种 Web 安全策略机制,它允许 Web 服务器向浏览器声明该网站应仅通过 HTTPS 连接访问,启用 HSTS 后,浏览器将强制所有后续请求使用 HTTPS,即使链接或用户输入的是 HTTP,从而有效防止中间人攻破(MITM)、SSL 剥离攻破以及 Cookie 截持等安全风险。
核心原理与工作机制
HSTS 的核心在于服务器通过响应头 Strict-Transport-Security 告知浏览器:“在未来的一段时间内,请使用 HTTPS 访问我”。
- 首次访问:当用户首次通过 HTTPS 访问支持 HSTS 的网站时,服务器会在响应头中携带 HSTS 策略。
- 浏览器缓存:浏览器接收到该头信息后,会将其存储在本地缓存中。
- 强制重定向:在 HSTS 策略有效期内,如果用户尝试通过 HTTP 访问该域名(例如手动输入 http://example.com 或点击 HTTP 链接),浏览器会在本地直接将其转换为 HTTPS 请求,而不会向服务器发起 HTTP 请求。
- 预加载列表(HSTS Preload):为了克服首次访问必须通过 HTTPS 才能获取 HSTS 头的问题,主流浏览器(Chrome, Firefox, Safari 等)维护了一个 HSTS 预加载列表,如果一个网站被加入此列表,浏览器在出厂或更新时就已经内置了该网站的 HSTS 策略,即使用户是第一次访问,也会强制使用 HTTPS。
配置 HSTS 响应头
HSTS 通过 HTTP 响应头 Strict-Transport-Security 进行配置,该头部包含以下关键参数:
| 参数 | 说明 | 示例值 |
|---|---|---|
| max-age | 必填,指定浏览器应遵守 HSTS 策略的时间(以秒为单位)。 | max-age=31536000 (1年) |
| includeSubDomains |
可选,如果存在,策略将应用于所有子域名。 | includeSubDomains |
| preload | 可选,如果存在,表示网站希望被加入浏览器的 HSTS 预加载列表。 | preload |
配置示例:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
实施步骤详解
确保 HTTPS 正常运行
在启用 HSTS 之前,必须确保网站已经正确配置了有效的 SSL/TLS 证书,并且所有资源(图片、脚本、样式表等)都通过 HTTPS 加载,如果网站存在混合内容(Mixed Content),启用 HSTS 会导致页面加载失败或显示不安全警告。
配置 Web 服务器
根据你使用的 Web 服务器软件,添加 HSTS 响应头。
-
Nginx 配置:
在 server 块中添加:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; -
Apache 配置:
启用 mod_headers 模块,并在配置文件中添加:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
-
IIS 配置:
在 web.config 文件中添加:
<system.webServer> <httpProtocol> <customHeaders> <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains; preload" /> </customHeaders> </httpProtocol> </system.webServer>
测试 HSTS 状态
使用在线工具(如 HSTS Preload Lookup)或浏览器开发者工具检查响应头。
- 在 Chrome 中,打开开发者工具(F12),切换到 “Network” 标签,刷新页面,点击任意请求,查看 “Response Headers” 中是否包含
Strict-Transport-Security。
- 使用命令行工具 curl 测试:curl -I https://yourdomain.com
加入 HSTS 预加载列表(可选但推荐)
为了获得最高级别的安全保障,建议将网站加入浏览器的 HSTS 预加载列表。

- 访问 HSTS Preload Submission 网站。
- 输入你的域名,系统会自动检查是否符合预加载条件(如 max-age 至少为 31536000 秒,包含 includeSubDomains,且没有 HTTP 可访问的页面)。
- 如果检查通过,点击 “Submit” 提交,浏览器厂商会定期审核并更新预加载列表。
注意事项与潜在风险
- 不要过早启用 preload:在确认网站完全稳定、所有子域名都支持 HTTPS 且没有遗留 HTTP 链接之前,不要添加 preload 参数,一旦加入预加载列表,很难移除,且移除后需要等待浏览器更新才能恢复 HTTP 访问。
- 子域名管理:如果使用了 includeSubDomains,则所有子域名都必须支持 HTTPS,如果某个子域名尚未准备好,可能会导致该子域名下的服务无法访问。
- 内部网络与开发环境:在本地开发或内部网络中,HSTS 可能会导致问题,建议在开发环境中禁用 HSTS,或在生产环境部署前仔细测试。
- 证书过期风险:SSL 证书过期或配置错误,启用 HSTS 后,用户将无法通过 HTTP 访问网站进行错误排查,因为浏览器会强制尝试 HTTPS 并因证书无效而阻止访问,确保证书自动续期机制可靠至关重要。
相关问题与解答
问题 1:如果我在启用 HSTS 后,SSL 证书配置错误导致网站无法通过 HTTPS 访问,用户该怎么办?
解答:
这是一个高风险场景,由于 HSTS 的存在,浏览器会强制使用 HTTPS,而不会回退到 HTTP,HTTPS 配置错误,用户将看到浏览器错误页面,无法通过 HTTP 访问网站进行修复。
解决方案:
- 紧急回退:立即从服务器配置中移除 Strict-Transport-Security 响应头。
- 等待浏览器缓存过期:max-age 设置得很长(如一年),普通用户可能需要等待缓存过期才能重新通过 HTTP 访问。
- 预加载列表的影响:如果网站已加入 HSTS 预加载列表,即使服务器移除了 HSTS 头,浏览器仍会强制使用 HTTPS,唯一的解决办法是等待浏览器厂商在下一个预加载列表更新周期中移除该域名,或者联系浏览器厂商申请紧急移除(通常需要提供证明)。
- 预防措施:在启用 HSTS 前,务必进行充分测试;使用较短的 max-age 进行初始测试(如 1 小时或 1 天),确认无误后再逐步增加时间。
问题 2:HSTS 能防止所有类型的中间人攻破吗?
解答:
HSTS 能显著降低多种中间人攻破的风险,但不能防止所有类型。
- 它能防止:SSL 剥离攻破(SSL Stripping)、Cookie 截持(Cookie 设置了 Secure 标志)、协议降级攻破。
- 它不能防止:
- 证书颁发机构(CA)被攻破或误发证书:如果攻破者获取了受信任的恶意证书,HSTS 无法阻止浏览器信任该证书。
- 设备级中间人攻破:如果用户的设备本身被植入恶意软件或企业级代理(如某些公司网络中的 SSL 解密代理),攻破者可以解密 HTTPS 流量。
- DNS 欺骗:DNS 记录被改动,用户可能被引导到攻破者控制的服务器,即使 HSTS 存在,如果攻破者拥有有效的证书(或通过其他手段获取),仍可能实施攻破。
- 零日漏洞:如果浏览器或操作系统存在未修补的安全漏洞,攻破者可能利用这些漏洞绕过 HSTS 保护。
HSTS 是 Web 安全的重要一环,但应与其他安全措施(如 CSP、XSS 防护、定期更新软件等)结合使用,形成纵深防御体系。