Public-Key-Pins 头还能用吗?配置后浏览器报错怎么办?

IT人成娟 阅读 59

我在项目里尝试加了个 Public-Key-Pins 安全头,结果 Chrome 直接报“HPKP is deprecated”错误,页面都加载不了了。查了下资料说这玩意儿已经被废弃了?那现在该用什么替代啊?

我是在 React 项目的 Nginx 配置里加的 header,但本地开发时也想模拟一下,就试了在代码里加 meta 标签(虽然知道可能无效),类似这样:

import React from 'react';

function App() {
  // 尝试在 useEffect 里设置 header(其实知道前端设不了,但还是试了)
  React.useEffect(() => {
    // 没用,但当时慌了就乱试
  }, []);

  return <div>Hello</div>;
}

现在彻底懵了,到底要不要配 HPKP?如果不用,怎么保证证书公钥不被中间人替换?

我来解答 赞 9 收藏
二维码
手机扫码查看
2 条解答
欧阳美丽
Public-Key-Pins (HPKP) 确实已经被废弃了,Chrome 和其他现代浏览器都不再支持它。你现在遇到的问题就是因为它已经不再受支持。不过别担心,还有其他方法可以保证证书公钥不被中间人替换,那就是 HTTP Public Key Pinning with Expect-CT (HPKP-Expect-CT),但这也不是最好的选择,目前推荐使用 Certificate Transparency 和 Expect-CT。

Certificate Transparency 是一种公开日志系统,可以记录所有 SSL/TLS 证书的颁发情况,这样即使有证书被非法签发,也能被发现。Expect-CT 则是用来强制浏览器只接受那些出现在已知透明日志中的证书。

要在 Nginx 中配置 Expect-CT,你可以这样做:

pre class="pure-highlightjs line-numbers">add_header Expect-CT 'max-age=86400, enforce, report-uri="https://yourdomain.com/report"';


这里的 max-age 是告诉浏览器多长时间内要遵守这个策略,enforce 表示如果证书不在透明日志中,则拒绝连接,report-uri 是用来接收违反策略的报告的 URL。

至于本地开发环境,前端代码里设置 HTTP 头是不可能的,因为那是服务器的事情。你只能通过修改 Nginx 或其他服务器配置来实现。

总之,虽然 HPKP 不再使用,但现代浏览器提供了更好的机制来保护你的网站不被中间人攻击,记得定期检查你的 SSL 证书和透明日志策略,保持安全意识。
点赞
2026-03-23 19:05
一玉娅
一玉娅 Lv1
HPKP确实已经被各大浏览器废弃了,主要是这玩意太容易搞砸网站。万一你配错了或者CA轮换密钥,用户就直接被锁在外面进不来了,典型的"安全过头反而不安全"。

现在改用Expect-CT头吧,虽然它也要被废弃了(安全圈就是这么折腾),但目前还能用。更靠谱的方案是直接上Certificate Transparency,配合TLS 1.3基本够用了。

Nginx里可以这么配:
add_header Expect-CT 'max-age=86400, enforce, report-uri="https://example.com/report"';


本地开发就别折腾这些了,直接用localhost开发时浏览器本来就会宽松处理。真要模拟的话建议上mkcert搞个本地证书,比折腾这些header实在多了。

说到中间人攻击,现在靠谱的CA基本都会加入Certificate Transparency日志,加上TLS 1.3的完善,被中间人替换的概率已经很低了。实在担心的话可以定期检查证书指纹,比HPKP这种自杀式防御靠谱多了。
点赞
2026-03-07 15:05