Public-Key-Pins 头还能用吗?配置后浏览器报错怎么办?
我在项目里尝试加了个 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?如果不用,怎么保证证书公钥不被中间人替换?
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 证书和透明日志策略,保持安全意识。
现在改用
Expect-CT头吧,虽然它也要被废弃了(安全圈就是这么折腾),但目前还能用。更靠谱的方案是直接上Certificate Transparency,配合TLS 1.3基本够用了。Nginx里可以这么配:
本地开发就别折腾这些了,直接用
localhost开发时浏览器本来就会宽松处理。真要模拟的话建议上mkcert搞个本地证书,比折腾这些header实在多了。说到中间人攻击,现在靠谱的CA基本都会加入Certificate Transparency日志,加上TLS 1.3的完善,被中间人替换的概率已经很低了。实在担心的话可以定期检查证书指纹,比HPKP这种自杀式防御靠谱多了。