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 通信。在用户看来网站照常显示,但通信内容对攻击者一览无遗。
HSTS 头部的指令
| 指令 | 说明 | 推荐值 |
|---|---|---|
| max-age | 浏览器记住 HSTS 策略的秒数。在此期间,浏览器会自动将 HTTP 访问转换为 HTTPS | 31536000 (1 年) |
| includeSubDomains | 将 HSTS 也应用于子域名。api.example.com 和 cdn.example.com 等也会被强制使用 HTTPS | 推荐设置 |
| preload | 表明注册到 HSTS Preload List 的意愿。它会被预先内置到浏览器中,从首次访问起即受保护 | 注册 Preload List 时必填 |
完整的 HSTS 头部示例:
HSTS Preload List
普通的 HSTS 存在「首次访问问题」。浏览器只有在首次 HTTPS 连接时才会收到 HSTS 头部,而在此之前的 HTTP 访问不受保护。HSTS Preload List 正是解决这一问题的机制。
一旦注册到 Preload List,Chrome、Firefox、Safari、Edge 等主流浏览器便会从首次访问起强制使用 HTTPS。但由于注销需要数月时间,若在 HTTPS 支持不完善的状态下注册,存在导致网站无法访问的风险。
分阶段的部署步骤
HSTS 的部署分阶段推进更为安全。若一开始就设置 max-age=31536000,一旦存在 HTTPS 配置错误,将导致网站长期无法访问。
首先以 5 分钟确认运行情况。即使出现问题,等待 5 分钟即可解除。
延长至 1 周。确认包括子域名在内的所有页面在 HTTPS 下正常运行。
包括子域名在内为期 1 个月。确认证书的自动续期正常运行。
最终形态。可以考虑注册到 Preload List 的阶段。
与 CSP 配合使用
HSTS 是强制对通信路径加密的机制,并不控制页面内的内容。通过与 CSP (Content Security Policy) 配合使用,可从通信路径和内容两方面强化安全性。CSP 的 upgrade-insecure-requests 指令是将页面内的 HTTP 资源引用自动转换为 HTTPS 的功能,与 HSTS 形成互补关系。要彻底落实通信加密,推荐同时设置 HSTS 和 CSP。
另请一并参阅浏览器密码的安全性、初创公司的安全检查清单、公共 Wi-Fi 的安全性。Web 安全相关书籍 (Amazon),推荐用来学习 HTTPS 运维的最佳实践。
这篇文章对您有帮助吗?