最后这个功能已经在 PHP 中实现了,只要你的 cURL 版本足够,你也可以在旧的 PHP 版本中使用它!
您可以使用 DER 格式的公钥的 SHA-256 哈希值进行固定。不要将其与证书指纹混淆! 您将在此处固定公钥,而不是证书。
最好参考官方 cURL 文档来提取此密钥。然而,可能有一种更简单的方法:引脚的格式与HPKP中使用的相同。因此,如果网络服务器使用 HPKP,我强烈建议您使用它发送到那里的哈希值!您只需从标题中复制并粘贴它们即可。您只需稍微更改一下格式,如下所示。
Public-Key-Pins: pin-sha256="cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs="; pin-sha256="M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE="; max-age=5184000;
Run Code Online (Sandbox Code Playgroud)
到达:
sha256//cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=;sha256//M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE
但请注意, HPKP 和 CURL 之间有一个很大的区别CURLOPT_PINNEDPUBLICKEY:在 HPKP 中,您可以固定中间证书的公钥,而使用 CURL 时,您目前无法执行此操作!
由于已经有很多 HPKP 教程,您还可以找到其他很好的指南来创建这些哈希值。例如,下面是Scott Helme使用现有证书文件的一行:
openssl x509 -pubkey < tls.crt | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
Run Code Online (Sandbox Code Playgroud)
最终选项的格式如下所示。您可以根据需要固定任意数量的密钥,我还建议固定至少一个当前未使用的备份密钥,这样您就可以在服务器出现故障或类似情况时轻松切换密钥。
sha256//Base64EncodedHashOfPublicKey;sha256//Base64EncodedHashOfAnotherPublicKey
或者,如果需要,您也可以指定证书文件的路径。
在 PHP 中你可以像这样使用它:
<?php
// this line makes it possible to use that option in PHP < 7.0.7
defined('CURLOPT_PINNEDPUBLICKEY') || define('CURLOPT_PINNEDPUBLICKEY', 10230);
$ch = curl_init("https://example.com");
curl_setopt($ch, CURLOPT_PINNEDPUBLICKEY, "YourPinsHere!!");
// ...
Run Code Online (Sandbox Code Playgroud)
之后,您应该通过指定无效的引脚来测试它。如果它没有失败,要么您的要求没有得到满足,要么您在实现它时出错了。您还可以使用以下命令在控制台上测试它:
卷曲https://example.com --pinnedpubkey "YourPinsHere!!"
小智 2
(不涉及证书颁发机构。)
默认情况下,curl 设置为不信任任何 CA。所以就是这样。在没有详细说明或基于意见的答复的情况下,这里有一个组织良好的“固定备忘单”,可能对您有一些帮助: https: //www.owasp.org/index.php/Pinning_Cheat_Sheet(无需赏金<3 )