1

我正在尝试在 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

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

4

1 回答 1

0

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

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

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

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

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

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

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

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

您应该看到两个部分:

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

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

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

于 2015-12-09T22:38:54.123 回答