跳转到主要内容

HSTS

本文约需 2 分钟阅读

HSTS (HTTP Strict Transport Security) 是一种安全机制,Web 服务器借此指示浏览器「今后只能通过 HTTPS 连接此域名」。它于 2012 年作为 RFC 6797 被标准化。通过强制使用 SSL/TLS 的加密通信,可防止属于中间人攻击一种的 SSL 剥离攻击。只需在 HTTP 响应头中添加一行即可部署,是性价比极高的安全措施。

什么是 SSL 剥离攻击

SSL 剥离是 Moxie Marlinspike 于 2009 年在 Black Hat DC 上发表的攻击手法。当用户访问 http://example.com 时,服务器通常会将其重定向到 https://example.com。攻击者拦截这一最初的 HTTP 通信,对用户保持 HTTP 通信,同时对服务器使用 HTTPS 通信。在用户看来网站照常显示,但通信内容对攻击者一览无遗。

SSL 剥离的流程:
1. 用户访问 http://example.com
2. 攻击者拦截 HTTP 请求
3. 攻击者以 HTTPS 连接服务器 (中继正规通信)
4. 以 HTTP 向用户返回响应
5. 用户的输入 (密码、卡号等) 以明文传递给攻击者
当启用 HSTS 时: 浏览器在发送 HTTP 请求之前会在内部将其转换为 HTTPS,因此在步骤 1 阶段攻击便无法成立

HSTS 头部的指令

指令说明推荐值
max-age浏览器记住 HSTS 策略的秒数。在此期间,浏览器会自动将 HTTP 访问转换为 HTTPS31536000 (1 年)
includeSubDomains将 HSTS 也应用于子域名。api.example.com 和 cdn.example.com 等也会被强制使用 HTTPS推荐设置
preload表明注册到 HSTS Preload List 的意愿。它会被预先内置到浏览器中,从首次访问起即受保护注册 Preload List 时必填

完整的 HSTS 头部示例:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

HSTS Preload List

普通的 HSTS 存在「首次访问问题」。浏览器只有在首次 HTTPS 连接时才会收到 HSTS 头部,而在此之前的 HTTP 访问不受保护。HSTS Preload List 正是解决这一问题的机制。

在 HSTS 头部中添加 preload在 hstspreload.org 申请注册Chromium 团队审核内置到浏览器的源代码中从首次访问起强制 HTTPS

一旦注册到 Preload List,Chrome、Firefox、Safari、Edge 等主流浏览器便会从首次访问起强制使用 HTTPS。但由于注销需要数月时间,若在 HTTPS 支持不完善的状态下注册,存在导致网站无法访问的风险。

分阶段的部署步骤

HSTS 的部署分阶段推进更为安全。若一开始就设置 max-age=31536000,一旦存在 HTTPS 配置错误,将导致网站长期无法访问。

Step 1 (5 分钟)
max-age=300

首先以 5 分钟确认运行情况。即使出现问题,等待 5 分钟即可解除。

Step 2 (1 周)
max-age=604800

延长至 1 周。确认包括子域名在内的所有页面在 HTTPS 下正常运行。

Step 3 (1 个月)
max-age=2592000; includeSubDomains

包括子域名在内为期 1 个月。确认证书的自动续期正常运行。

Step 4 (1 年)
max-age=31536000; includeSubDomains; preload

最终形态。可以考虑注册到 Preload List 的阶段。

与 CSP 配合使用

HSTS 是强制对通信路径加密的机制,并不控制页面内的内容。通过与 CSP (Content Security Policy) 配合使用,可从通信路径和内容两方面强化安全性。CSP 的 upgrade-insecure-requests 指令是将页面内的 HTTP 资源引用自动转换为 HTTPS 的功能,与 HSTS 形成互补关系。要彻底落实通信加密,推荐同时设置 HSTS 和 CSP。

另请一并参阅浏览器密码的安全性初创公司的安全检查清单公共 Wi-Fi 的安全性Web 安全相关书籍 (Amazon),推荐用来学习 HTTPS 运维的最佳实践。

相关术语

这篇文章对您有帮助吗?

XHatena