HTTP公钥固定

HTTP公钥固定（又称HTTP公钥钉扎，英語：HTTP Public Key Pinning，缩写HPKP）是HTTPS网站防止攻击者利用数字证书认证机构（CA）错误签发的证书进行中间人攻击的一种安全机制，用于预防CA遭受入侵或其他会造成CA签发未授权证书的情况。采用公钥固定时，网站会提供已授权公钥的哈希列表，指示客户端在后续通讯中只接受列表上的公钥。 服务器通过Public-Key-Pins（或Public-Key-Pins-Report-Only用于监测）HTTP头向浏览器传递HTTP公钥固定信息。 HTTP公钥固定将网站X.509证书链中的一个SPKI（和至少一个备用密钥）以pin-sha256方式进行哈希，由参数max-age（单位秒）所指定一段时间，可选参数includeSubDomains决定是否包含所有子域名，另一个可选参数report-uri决定是否回报违反HTTP公钥固定策略的事例。在max-age所指定的时间内，证书链中证书的至少一个公钥须和固定公钥相符，这样客户端才认为该证书链是有效的。 RFC 7469规范发布时只允许SHA-256算法。HTTP公钥固定中的哈希算法也可通过RFC 7469规范的附录A中所提到的命令行或其他第三方工具来生成。 网站维护者可以选择将特定CA根证书公钥固定——只有该CA和其签发的中级证书才视同有效，而且可以选择将一个或多个中级证书固定，或将末端证书固定。但是，至少得固定一个备用密钥以便更换现有的固定密钥。在没有备用密钥（备用密钥须不在现有证书链中）时，HTTP公钥固定并不会生效。 HTTP公钥固定在RFC 7469规范中成为标准。把证书公钥的哈希值硬编码在客户端、浏览器中，这被称为“证书固定”，HTTP公钥固定则是“证书固定”的一种扩展。 Chromium浏览器现已经禁止固定自签名根证书的证书链，这样一些内容嗅探、抓包软件如mitmproxy、Fiddler便无法再利用自签证书嗅探加密内容。RFC 7469规范指出，对于此类证书链，建议禁用HTTP公钥固定的违规回报。 客户端进行HTTP公钥固定验证失败后，将把此次错误详情以JSON格式回报给report-uri参数中指定的服务器。若发生客户端向同域名的服务器端回报失败（如违规本身就是由连接问题引起的），服务器端也可指定另一个域名或采用其他回报服务。 Firefox从版本35.0开始支持HPKP，Chrome从版本46开始支持，但在Chrome 67中终止了对HPKP的支持 。Internet Explorer、Microsoft Edge目前尚不支持HPKP。 2016年，Netcraft（英语：Netcraft）在有关SSL的调研中称，只有0.09%的证书在使用HTTP公钥固定，加上实际运作中不当的配置，实际有效的HTTP公钥固定证书数量低于3000。造成这种现象的原因是：该技术尚处于萌芽期，网站技术人员对其缺乏重视和理解，更重要的是，错误的部署可能带来网站方面无法接受的严重后果——用户在相当长一段时间内（取决于max-age的配置）因新证书公钥与旧HPKP策略不符，对网站的合法访问都将遭拒。 因为网站部署率过低，Google在2018年5月29日发布的Chrome 67中终止了对HPKP的支持。 由Google所主导的证书透明度提供了一个用于监测、审核证书的开放式框架，以保障证书签发流程的安全。这是一项和HTTP公钥固定有着相同目标的较新项目。 中间人攻击 HTTP严格传输安全（HTTP Strict Transport Security，HSTS） RFC 7469 RFC 7469. tools.ietf.org. Internet Engineering Task Force. [2016-12-04]. （原始内容存档于2018-01-05） （英语）.  Server and Client Behavior. RFC 7469. Internet Engineering Task Force. [2016-12-04]. （原始内容存档于2018-01-05） （英语）.  Fingerprint Generation. RFC 7469. Internet Engineering Task Force. [2016-12-04]. （原始内容存档于2018-01-05） （英语）.  About Public Key Pinning. noncombatant.org. [2015-05-07]. （原始内容存档于2015-05-15） （英语）.  Certificate and Public Key Pinning - OWASP. www.owasp.org. [2015-05-07]. （原始内容存档于2015-05-18）.  Security FAQ - The Chromium Projects. www.chromium.org. [2015-07-07]. （原始内容存档于2015-07-09） （英语）.  Validating Pinned Connections. RFC 7469. Internet Engineering Task Force. [2016-12-04]. （原始内容存档于2018-01-05） （英语）.  HPKP Violation Reporting. Scott Helme. （原始内容存档于2015-09-28） （英语）.  Reporting Pin Validation Failure. RFC 7469. Internet Engineering Task Force. [2016-12-04]. （原始内容存档于2018-01-05） （英语）.  Public Key Pinning. mozilla.org. 2015-12-10 [2015-12-22]. （原始内容存档于2015-12-04） （英语）.  Rolling out Public Key Pinning with HPKP Reporting. Google Developers. 2016-11-30 [2016-12-05]. （原始内容存档于2016-12-04） （英语）.  Joseph Medley. Deprecations and removals in Chrome 67. Google Developers. 2017-10-29 [2019-01-05]. （原始内容存档于2019-03-23） （英语）.  The status of public key pinning extension in Microsoft Edge is under consideration. Microsoft. [2016-12-04]. （原始内容存档于2016-12-20） （英语）.  Paul Mutton. Secure websites shun HTTP Public Key Pinning. Netcraft. 2016-03-22 [2016-12-04]. （原始内容存档于2016-12-20） （英语）.  Google透明度报告中的Certificate Transparency. Google. [2016-12-04]. （原始内容存档于2016-12-20） （中文）.  在Apache、nginx、Lighttpd上启用HPKP（页面存档备份，存于互联网档案馆） 安全网站为何对HPKP敬而远之？（页面存档备份，存于互联网档案馆） Certificate Transparency项目网站（页面存档备份，存于互联网档案馆）