什么是 HSTS?

HSTS(HTTP Strict Transport Security)是一种网络安全策略机制,允许网站声明浏览器必须仅通过 HTTPS 连接访问。一旦服务器发送 Strict-Transport-Security 响应头,浏览器就会记住这个指令,在指定时间内(max-age)自动将所有 HTTP 请求转换为 HTTPS。

HSTS 响应头格式

1
Strict-Transport-Security: max-age=<过期时间>; includeSubDomains; preload

参数说明

参数 说明
max-age 浏览器记住该规则的时长,单位为秒。例如 31536000 代表一年
includeSubDomains 可选指令,作用范围包含所有子域名
preload 可选指令,表示该域名申请加入 HSTS 预加载列表

实际案例

查看主流网站的 HSTS 头配置:

1
2
# 使用 curl 查看 HSTS 响应头
curl -sI https://cloudflare.com | grep -i strict-transport-security

输出示例:

1
Strict-Transport-Security: max-age=15552000; includeSubDomains

验证多个网站

1
2
3
4
5
# 检查不同网站的 HSTS 配置
for domain in cloudflare.com google.com github.com; do
    echo "=== $domain ==="
    curl -sI https://$domain | grep -i strict-transport-security
done

Nginx 配置 HSTS

在服务器配置中添加 HSTS 头:

1
2
3
4
5
6
7
8
9
server {
    listen 443 ssl http2;
    server_name example.com;
    
    # SSL 配置...
    
    # 启用 HSTS,有效期一年,包含子域名
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}

多个子域名的配置

如果所有子域名都支持 HTTPS,建议加上 includeSubDomains

1
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

注意:启用 includeSubDomains 前确保所有子域名都已配置 HTTPS,否则子域名将无法通过 HTTP 访问。

HSTS 工作原理

  1. 首次访问:用户通过 HTTPS 访问网站,服务器返回 HSTS 头
  2. 浏览器记录:浏览器将域名加入 HSTS 列表,记录有效时长
  3. 后续访问:即使用户输入 http:// 或点击 HTTP 链接,浏览器自动转换为 HTTPS
  4. 过期失效:超过 max-age 后,浏览器不再强制使用 HTTPS

HSTS 预加载列表

HSTS 预加载列表是内置在浏览器中的域名列表,这些域名强制使用 HTTPS。提交到预加载列表需要满足:

  • 有效的 SSL/TLS 证书
  • 所有子域名支持 HTTPS
  • 在响应头中包含 preload 指令
  • 设置较长的 max-age(至少一年)

提交地址:https://hstspreload.org/

HSTS 的安全价值

防止协议降级攻击

阻止攻击者试图让用户使用不安全的 HTTP 连接。

确保 Cookie 始终通过加密通道传输,防止被窃取。

提升用户安全感

地址栏显示安全锁标志,增强用户信任。

注意事项

  1. 首次访问必须是 HTTPS:如果用户首次通过 HTTP 访问,HSTS 不会生效
  2. max-age 设置:建议至少设置 6 个月,长期站点可设置 1-2 年
  3. 谨慎使用 includeSubDomains:确保所有子域名都支持 HTTPS
  4. 证书问题:一旦证书失效,用户在 max-age 期间内将无法访问站点

查看浏览器中的 HSTS 域名

Firefox:

1
2
# 查看 Firefox HSTS 存储
sqlite3 ~/.mozilla/firefox/*.default/security.slt "SELECT * FROM hsts;"

Chrome:

1
2
# Chrome HSTS 域名列表
chrome://net-internals/#hsts

总结

HSTS 是提升 HTTPS 安全性的重要机制,通过强制浏览器使用加密连接,有效防止中间人攻击和协议降级攻击。生产环境建议启用,并考虑提交到预加载列表以获得更全面的保护。


参考来源