为什么 HTTPS 还不够?
很多人认为部署了 SSL/TLS 证书、网站能通过 HTTPS 访问就万事大吉了。但事实是,HTTPS 只解决了传输层加密的问题,它并不能阻止降级攻击、证书伪造、内容注入等高级威胁。攻击者仍然可以通过 SSL Stripping 强制用户回退到 HTTP,或者利用被攻破的 CA 签发虚假证书来实施中间人攻击。
要真正构建一个纵深防御体系,你需要借助 HTTP 安全响应头来弥补 HTTPS 的不足。本文将深入讲解四个关键安全头——HSTS、HPKP、Expect-CT 和 CSP——以及它们如何协同工作,为你的网站提供端到端的安全保障。
HSTS:强制浏览器使用 HTTPS
什么是 HSTS?
HSTS(HTTP Strict Transport Security)通过 Strict-Transport-Security 响应头告诉浏览器:在指定时间内,对该域名的所有请求必须使用 HTTPS,即使用户手动输入了 http:// 或点击了 HTTP 链接。
配置示例
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
- max-age:策略有效期(秒),建议至少 6 个月(15768000),一年(31536000)更佳。
- includeSubDomains:策略适用于所有子域名。
- preload:申请加入浏览器预加载列表,使首次访问也强制 HTTPS。
注意事项
启用 preload 前务必确认所有子域名都支持 HTTPS,否则会导致部分服务不可访问。提交预加载后,从列表中移除可能需要数月时间。建议先设置较短的 max-age 进行测试,逐步增加。
HPKP:证书公钥锁定(已废弃但值得了解)
什么是 HPKP?
HPKP(HTTP Public Key Pinning)允许网站告诉浏览器只信任特定公钥哈希对应的证书。即使攻击者获得了合法 CA 签发的证书,只要公钥不匹配,浏览器就会拒绝连接。
配置示例
Public-Key-Pins: pin-sha256="base64=="; pin-sha256="base64=="; max-age=5184000; includeSubDomains
为什么被废弃?
HPKP 的设计存在严重问题:一旦配置错误(如丢失备用密钥),网站将在 max-age 期间完全无法访问,且无法远程撤销。此外,它容易被滥用进行拒绝服务攻击。Chrome 从 2018 年起移除了对 HPKP 的支持。
替代方案:使用 Certificate Transparency(证书透明度)和 Expect-CT 头来实现类似的安全目标。
Expect-CT:确保证书透明度
什么是 Expect-CT?
Expect-CT(Expect Certificate Transparency)要求浏览器验证网站证书是否出现在公开的 CT 日志中。如果证书未被记录,浏览器将拒绝连接。这可以有效检测和阻止恶意或误签发的证书。
配置示例
Expect-CT: max-age=86400, enforce, report-uri="https://example.com/ct-report"
- max-age:策略缓存时间。
- enforce:强制模式,违反策略时拒绝连接;不加此参数则为报告模式。
- report-uri:接收违规报告的端点。
部署建议
建议先以报告模式运行一段时间,收集并分析 CT 合规情况,确认无误后再启用 enforce。需要注意的是,当证书本身已满足 CT 要求时,浏览器会忽略此头。随着 CT 成为行业标准,Expect-CT 的重要性正在逐渐降低,Chrome 已计划移除支持。
CSP:防御内容注入的利器
什么是 CSP?
CSP(Content Security Policy)通过 Content-Security-Policy 响应头限制页面可以加载哪些资源,从而有效防御 XSS、点击劫持、数据注入等攻击。它是目前最强大的浏览器端安全策略之一。
配置示例
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'none'; report-uri https://example.com/csp-report
关键指令
- default-src:所有资源类型的默认回退策略。
- script-src:控制 JavaScript 来源,是防御 XSS 的核心。
- frame-ancestors:替代 X-Frame-Options,防止点击劫持。
- report-uri / report-to:收集违规报告,便于调试和监控。
部署策略
使用 Content-Security-Policy-Report-Only 头进行测试,观察报告中的违规情况,逐步收紧策略。避免使用 unsafe-inline 和 unsafe-eval,尽量采用 nonce 或 hash 机制。
四个安全头的协同作战
这四个安全头并非孤立存在,它们在不同的攻击阶段形成互补:
- HSTS 在第一道防线阻止 HTTP 降级,确保后续所有通信都基于 TLS。
- HPKP(历史方案)和 Expect-CT 在证书层面提供额外验证,防止伪造证书被信任。
- CSP 在应用层阻止恶意内容执行,即使攻击者突破了前面的防线,也难以造成实质性损害。
一个完整的推荐配置如下:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Expect-CT: max-age=86400, enforce, report-uri="https://example.com/ct-report"
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-abc123'; style-src 'self'; img-src 'self' https:; frame-ancestors 'none'; report-uri https://example.com/csp-report
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
部署检查清单
- 确认全站 HTTPS 可用,包括所有子域名
- 从小 max-age 开始部署 HSTS,逐步增加
- 使用 Report-Only 模式测试 CSP,分析报告后再强制执行
- 监控 Expect-CT 报告,确保证书已提交至 CT 日志
- 定期审计安全头配置,使用 SecurityHeaders.com 等工具检测
- 建立安全头变更的回归测试流程
总结
HTTPS 安全头是构建网站纵深防御体系不可或缺的一环。HSTS 确保传输层不被降级,Expect-CT 验证证书的公开可审计性,CSP 则在应用层筑起最后一道屏障。虽然 HPKP 已退出历史舞台,但理解它的设计教训有助于我们更好地评估新安全机制的风险。合理配置并持续监控这些安全头,才能让 HTTPS 真正发挥应有的保护作用。
未经允许不得转载:任鹏个人博客 » HTTPS 安全头配置指南:HSTS、HPKP、Expect-CT 与 CSP 的协同使用


朋友圈点赞图在线生成源码