我正在尝试使用cacert.org的免费客户端证书进行curl调用。检查以下......
$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
我已经尝试过一切但无法解决,也尝试了谷歌。请帮忙。
答案 0 :(得分:0)
我认为问题在于您的证书文件不包含私钥,并且不是使用CURLOPT_SSLKEY
选项单独提供的,该选项指向相应的私钥。证书。
我猜测证书是从CA发给您并安装在浏览器中的。发生这种情况时,浏览器会将私钥存储在与证书分开的安全位置(取决于操作系统和浏览器)。
大多数浏览器都不允许您在不加密证书和私钥的情况下导出证书和私钥(提供密码)。但根据您的PEM文件的内容,没有相应的私钥。
要解决此问题,您可能需要完成以下几个步骤:
现在的问题是私钥是加密的,据我所知,它需要为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
,以便其他用户无法访问