网站安全中的HTTP公钥钉扎(HPKP)已经被主流浏览器弃用,因为它风险太高、部署复杂,容易导致网站被永久锁定无法访问。现在更可靠的替代方案是使用Certificate Transparency(证书透明度)和Expect-CT头,配合强制HTTPS(HSTS)来确保连接安全。

为什么HTTP公钥钉扎(HPKP)被弃用?

HPKP的原理是让网站告诉浏览器:“只信任我指定的几个公钥,其他一律拒绝。”这听起来很安全,但实际操作中问题很多。首先,如果你丢失了备份密钥或指定的密钥对出现问题,你的网站就会被浏览器彻底封锁,连你自己也无法恢复。这种“自杀式”防护让很多管理员望而却步。其次,部署HPKP需要极高的技术精度,一旦配置错误,后果可能是灾难性的。最后,HPKP容易被滥用——如果攻击者控制了你的服务器,他们可以植入自己的公钥,从此永久劫持你的网站。正因为这些缺陷,从2017年开始,Chrome、Firefox等主流浏览器相继移除了对HPKP的支持。

当前首选的替代方案:证书透明度(Certificate Transparency, CT)

证书透明度是一个开放的审计框架,要求所有公开信任的证书颁发机构(CA)将颁发的证书记录到公共日志中。这些日志是防篡改且可公开查询的,任何人都可以监控是否有未经授权的证书被签发。对于网站所有者来说,启用CT意味着你可以及时发现是否有攻击者试图为你的域名申请非法证书。部署方法很简单:在服务器配置中确保你的SSL/TLS证书包含了CT信息(大多数正规CA会自动提供),同时使用Expect-CT头来强制浏览器检查证书是否在公开日志中。

以下是一个Expect-CT头的配置示例(适用于Apache服务器):

Header always set Expect-CT "enforce, max-age=86400, report-uri='https://example.com/report-ct'"

这个头告诉浏览器:必须强制CT检查(enforce),策略缓存86400秒(一天),并将违规报告发送到指定的report-uri。这样,即使有CA错误签发了证书,浏览器也会拒绝连接,大大降低了中间人攻击的风险。

强化HTTPS:必须启用HSTS(HTTP Strict Transport Security)

HSTS是HPKP弃用后不可或缺的基石。它通过HTTP响应头指示浏览器“在指定时间内只通过HTTPS访问该网站”,防止SSL剥离攻击。配置HSTS后,即使用户手动输入http://,浏览器也会自动跳转到https://。一个完整的HSTS头应包含子域名覆盖和预加载选项。

Apache服务器配置示例:

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

这里的max-age设为一年(31536000秒),includeSubDomains确保所有子域名也强制HTTPS,preload则允许将你的域名提交到浏览器内置的HSTS预加载列表,实现全局保护。注意:启用preload后需通过hstspreload.org提交,且撤销非常困难,务必确保你的全站HTTPS稳定可靠。

进阶加固:使用CAA记录和OCSP装订

除了CT和HSTS,还有两个关键措施能进一步提升证书安全。第一是CAA(Certificate Authority Authorization)DNS记录,它允许你指定哪些CA有权为你的域名颁发证书。例如,你只信任Let's Encrypt和DigiCert,那么其他CA的申请将被拒绝。添加一条CAA记录非常简单:

example.com. IN CAA 0 issue "letsencrypt.org"
example.com. IN CAA 0 issue "digicert.com"

第二是OCSP装订(OCSP Stapling),它解决了证书吊销状态查询的隐私和性能问题。服务器会定期获取OCSP响应并“装订”在TLS握手过程中,浏览器无需再向CA查询,既加快了速度又避免了隐私泄露。在Nginx中启用只需两行:

ssl_stapling on;
ssl_stapling_verify on;

监控与响应:设立安全报告端点

安全策略必须有闭环反馈。Expect-CT和未来的报告规范(如Report-URI)都依赖报告机制。你应该设置一个安全的接收端点(如https://example.com/report-uri),收集浏览器发送的违规报告。这些报告能帮你快速发现攻击尝试或配置错误。可以使用开源工具(如报告服务器)或第三方服务来处理数据,关键是要定期分析日志,并建立应急响应流程。

未来方向:转向TLS 1.3和更简化的安全模型

TLS 1.3协议已经移除了许多过时的加密套件和特性,提供了更简洁、更安全的基础。在HPKP弃用后,行业共识是“减少主动密钥管理,依赖更自动化的基础设施”。这意味着网站安全将更依赖于:强制HTTPS(HSTS)、证书透明度审计、快速的证书吊销(如CRLite项目),以及浏览器和CA生态的协同。作为管理员,你的重点应是正确配置这些标准化工具,而不是自定义复杂的密钥钉扎规则。

实操检查清单

1. 确保全站启用HTTPS,并配置301重定向从HTTP到HTTPS。
2. 部署HSTS头,并考虑提交预加载列表。
3. 从你的CA获取已嵌入CT信息的证书,并在服务器配置Expect-CT头。
4. 在DNS中添加CAA记录,限制授权CA。
5. 在服务器上启用OCSP装订。
6. 设置报告URI,监控安全报告。
7. 定期使用在线工具(如SSL Labs测试)检查配置是否牢固。

遵循以上步骤,你就能在不依赖HPKP的情况下,构建一个更稳健、更易维护的网站安全体系。记住,最好的安全方案往往是简单、标准且经过广泛验证的。