php - EPP 调用上的客户端证书

标签 php ssl curl ssl-certificate epp

我正在尝试在 curl 调用中使用 cacert.org 提供的免费客户端证书。检查以下...

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://url.com');
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSLCERT, 'cert.crt');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

我已将证书下载为 PEM,现在出现以下错误...

unable to set private key file: 'cert.crt' type PEM

我已经尝试了所有方法但无法修复,也尝试了谷歌。请帮忙。

最佳答案

我认为问题在于您的证书文件包含私钥,并且没有使用指向相应私钥的 CURLOPT_SSLKEY 选项单独提供证书的 key 。

我猜证书是由 CA 颁发给您并安装在您的浏览器中。发生这种情况时,浏览器会将私钥存储在与证书分开的安全位置(取决于操作系统和浏览器)。

大多数浏览器不允许您在不加密(提供密码)的情况下导出证书和私钥。但是根据你的PEM文件的内容,没有对应的私钥。

要解决这个问题,您可能需要执行以下几个步骤:

  • 再次从浏览器中导出证书并确保其中包含私钥
  • Win/Linux 上的 Chrome 和 Windows 上的 Internet Explorer 将要求您输入密码。证书应导出为 PKCS#12 (.p12) 文件

现在的问题是私钥是加密的,据我所知cURL需要解密

  • 使用openssl解密私钥并将证书和 key 导出为PEM格式
  • openssl pkcs12 -in cert.p12 -nodes(这将询问您从浏览器导出时用于加密的密码)(cert.p12 是 PKCS12 格式的证书和私钥。 -nodes允许私钥不加密导出)

这将以 PEM 格式将证书和 key 打印到标准输出。

您应该看到两个部分:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

您很可能已经拥有证书,但您需要将私钥保存到另一个文件中。 由于它在服务器上未加密,请务必正确设置权限,通常为 0400,这样其他用户就无法访问它

关于php - EPP 调用上的客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34164068/

相关文章:

php - 如何使用 cURL 签署使用 sfGuardUser 的 Symfony 项目?

linux - 在 Linux 上安装 Node 版本

curl - 通过SSH在特定目录中使用curl?

php - PHP 和 MySQL 的时区问题

ios - 我有 iOS 10 TSL 问题 ("Security Error: -9801")。怎么修?

php - Laravel 8 - 在线支付 przelewy24 网关实现

C++ SSL/HTTPS 301 重定向循环

spring - 为 spring 中创建的 Active Mq 代理配置 https 时出现问题

php - 选择周一到周五之间的日期

php - 选择最后受影响的行