繁体   English   中英

使用PHP + Curl进行TLS公钥固定?

[英]TLS Public Key Pinning with PHP + Curl?

我想在两个通过TLS 1.2保护的应用程序之间建立通信,其中端点的公钥被固定。 (没有涉及证书颁发机构。)

此外,我甚至不想处理证书; 只是RSA / ECDSA公钥。

具体来说,它们都是PHP应用程序,我使用curl来促进通信。

有没有人完成过这个?

最后,这个功能已经在PHP中实现,只要您的cURL版本足够,您也可以在旧的PHP版本中使用它!

要求

  • PHP v7.0.7或更高版本(下面显示了一个技巧,使其适用于早期版本)
  • cURL v7.39或更高版本

准备(获取针脚)

您可以使用DER格式的公钥的SHA-256哈希值进行固定。 不要将此与证书指纹混淆! 您将固定公钥,而不是此处的证书。

最好引用官方cURL文档来提取此密钥。 但是可能有一种更简单的方法:引脚的格式与HPKP中使用的格式相同。 因此,如果网络服务器使用HPKP, 我强烈建议您使用它发送的哈希值! 您只需从标题中复制并粘贴它们即可。 您只需稍微更改格式,如下所示。

Public-Key-Pins: pin-sha256="cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs="; pin-sha256="M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE="; max-age=5184000;

得到:

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

选项的格式最终如下所示。 您可以根据需要固定多个密钥,我还建议至少固定一个当前未使用的备份密钥,以便在发生服务器破坏或类似情况时轻松切换密钥。

SHA256 // Base64EncodedHashOfPublicKey; SHA256 // Base64EncodedHashOfAnotherPublicKey

或者,您也可以根据需要指定证书文件的路径。

在PHP中使用

在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!!");
// ...

之后你应该通过指定无效的引脚来测试它。 如果它没有失败,则要么不满足您的要求,要么在实现它时出错。 您也可以使用以下命令在控制台上测试它:

curl https://example.com --pinnedpubkey“YourPinsHere !!”

我不知道解决方案,但我可以为您提供一些方向来发现:

  1. 看一下http://php.net/manual/en/function.curl-setopt.php特别是在CURLOPT_SSH_HOST_PUBLIC_KEY_MD5选项中。 它不允许验证完整的公钥,只是它的md5哈希。

  2. 作为另一种变体,您可以通过控制台实现处理CURL的自己的服务。 它允许你传递任何选项卷曲。 这是默认的卷曲库。

(没有涉及证书颁发机构。)

默认情况下,curl设置为不信任任何CA. 就是这样。 并且没有详细介绍或基于意见的回复,这里有一个组织良好的“Pinning Cheat Sheet”可能会对你有所帮助: https//www.owasp.org/index.php/Pinning_Cheat_Sheet (不需要赏金<3 )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM