HTTP Public Key Pinning(HPKP)
Chrome 67 以弃用,使用率低。
证书动态续期,不好配置
防范由「伪造或不正当手段获得网站证书」造成的中间人攻击
现有的证书信任链机制最大的问题是,任何一家受信任的 CA 都可以签发任意网站的站点证书,这些证书在浏览器看来,都是合法的
工作原理是通过响应头或者 标签告诉浏览器当前网站的证书(证书链中任何一个都可以,中间证书最合适)指纹,以及过期时间等其它信息。未来一段时间内,浏览器再次访问这个网站必须验证证书链中的证书指纹,如果跟之前指定的值不匹配,即便证书本身是合法的,也必须断开连接。
基本格式如下:
Public-Key-Pins: pin-sha256="base64=="; max-age=expireTime [; includeSubdomains][; report-uri="reportURI"]
- pin-sha256 即证书指纹,允许出现多次(实际上最少应该指定两个);
建议先验证证书是否有误:
openssl x509 -in intermediate.pem -noout -subject
subject= /C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G4
通过 CN(Common Name)字段可以确认这就是本站的中间证书。接着,生成 Public Key(内置在证书里):
openssl x509 -in intermediate.pem -noout -pubkey | openssl asn1parse -noout -inform pem -out public.key
生成指纹:
openssl dgst -sha256 -binary public.key | openssl enc -base64
aef6IF2UF6jNEwA2pNmP7kpgT6NFSdt7Tqf5HzaIGWI=
按照同样方法,生成其它中间证书的备用指纹。