HTTPPublicKeyPinning(HPKP)是一种Web安全机制,它允许网站管理员告知浏览器对于特定网站使用哪些SSL/TLS证书,以防止恶意者使用自签名证书等攻击手段入侵网站进行中间人攻击。
HPKP的工作原理是,网站管理员将网站的公钥指纹信息通过HTTP响应头的“Public-Key-Pins”字段发送给浏览器,浏览器会将公钥指纹信息保存在本地,并在后续对该网站请求时检查证书的指纹信息是否与之前保存的一致。如果检查不通过,则浏览器不会建立该请求的安全连接,而是直接中止连接,以保护用户的安全。
以下是使用HPKP的示例说明:
- 在HTTP响应头中添加Public-Key-Pins字段
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html;charset=UTF-8
Date: Fri, 31 Mar 2017 09:36:42 GMT
Public-Key-Pins: pin-sha256="your_public_key_hash"; max-age=5184000; includeSubDomains
Server: nginx
Strict-Transport-Security: max-age=31536000; includeSubDomains
Vary: Accept-Encoding
其中,Public-Key-Pins字段指定了证书公钥的指纹信息,根据需求可设置多个公钥指纹信息,使用分号分隔。max-age字段指定了HPKP的有效期,以秒为单位。includeSubDomains则表示子域名也需要遵循该指令。
- 检查HPKP配置是否生效
可以通过以下方法检查HPKP配置是否生效:
(1)使用Chrome/Firefox浏览器访问该网站,打开开发者工具 -> Security -> Security Overview。在“Certificate Transparency”下方,可以看到“Public key pins”的详细信息,如果该信息与配置相同,则说明HPKP生效。
(2)执行以下代码:
$ openssl s_client -connect <domain>:<port> < /dev/null 2> /dev/null | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | base64
将上述代码替换domain和port后执行,如果生成的哈希与在响应头字段Public-Key-Pins中指定的哈希值相同,则说明HPKP生效。
以上是关于HTTPPublicKeyPinning(HPKP)的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:什么是HTTP Public Key Pinning(HPKP)? - Python技术站