什么是HSTS?
HSTS(HTTP严格传输安全)是一种网络安全机制,告诉浏览器仅通过HTTPS与网站交互,永不HTTP。一旦浏览器看到HSTS头,它会自动将所有未来请求升级到HTTPS,并拒绝通过纯HTTP连接,即使用户明确输入http://。
为什么HSTS很重要
即使有效的SSL证书,漏洞仍然存在:
SSL剥离攻击
1. 用户输入"example.com"(无https://)
2. 攻击者拦截初始HTTP请求
3. 攻击者代理到HTTPS,向用户显示HTTP
4. 用户认为他们是安全的,但攻击者看到一切
HSTS通过确保浏览器从不发出那个初始HTTP请求来防止这个。
HSTS的好处
- 防止降级攻击:无HTTP回退可能
- 保护用户书签:即使旧HTTP书签也变为HTTPS
- 消除混合内容:子资源也强制为HTTPS
- 改进性能:无HTTP→HTTPS重定向需要
HSTS头语法
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
指令
| 指令 | 描述 |
|---|---|
| max-age | 秒数以记住HSTS(31536000 = 1年) |
| includeSubDomains | 将HSTS应用到所有子域 |
| preload | 同意浏览器预加载列表包含 |
实施HSTS
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Cloudflare
在SSL/TLS→边缘证书→HTTP严格传输安全中启用
Express.js
const helmet = require('helmet');
app.use(helmet.hsts({
maxAge: 31536000,
includeSubDomains: true,
preload: true
}));
HSTS预加载列表
HSTS预加载列表是硬编码到浏览器中的域列表,应仅通过HTTPS访问。这消除了即使第一个HTTP请求漏洞。
预加载要求
1. 有效的SSL证书
2. 重定向所有HTTP到HTTPS
3. HSTS头带有:
- max-age至少31536000(1年)
- includeSubDomains指令
- preload指令
4. 所有子域必须支持HTTPS
提交到预加载列表
1. 验证要求:使用hstspreload.org检查
2. 提交域:在hstspreload.org输入域
3. 等待包含:需要数周至数月才能进行浏览器更新
预加载警告
预加载是永久的(实际上)。从列表中删除需要数月并需要浏览器更新。仅当你确定所有子域将无限期支持HTTPS时才预加载。检查HSTS
浏览器开发工具:1. 打开开发工具→网络标签
2. 加载网站
3. 在响应头中检查Strict-Transport-Security
使用curl:curl -I https://example.com | grep -i strict
使用DomScan:
curl "https://domscan.net/v1/health?domain=example.com"
# 在安全详情中报告hasHSTS
预加载状态:
检查hstspreload.org查看域是否被预加载。
HSTS部署策略
阶段1:短max-age
从短max-age开始以测试:
Strict-Transport-Security: max-age=300
如果某些事情破坏,用户只缓存5分钟。
阶段2:增加持续时间
确认HTTPS到处都工作后:
Strict-Transport-Security: max-age=86400
阶段3:添加子域
所有子域支持HTTPS后:
Strict-Transport-Security: max-age=2592000; includeSubDomains
阶段4:完整部署+预加载
经过数月的稳定运作后:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
然后提交到预加载列表。
常见HSTS问题
不支持HTTPS的子域:includeSubDomains破坏该子域 开发环境:从生产缓存的HSTS破坏本地开发 CDN/代理头:确保HSTS头不被中间件去除 混合内容:所有资源必须是HTTPS;HSTS不修复嵌入的HTTP资源HSTS对任何处理敏感数据的网站至关重要,强烈推荐所有HTTPS网站。