我正在尝试使用 cURL 连接到远程主机。连接需要使用证书和受密码保护的私钥。到目前为止,我没有成功使用以下代码:
<?php
$wsdl = 'https://domain.com/?wsdl';
$certFile = getcwd() . '/auth/cert.pem';
$keyFile = getcwd() . '/auth/key.pem';
$password = 'pwd';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $wsdl);
curl_setopt($ch, CURLOPT_SSLCERT, $certFile);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $password);
curl_setopt($ch, CURLOPT_SSLKEY, $keyFile);
#curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
#curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
#curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$output = curl_exec($ch);
var_dump(curl_errno($ch));
var_dump(curl_error($ch));
我一直得到的结果是错误 58
: unable to set private key file: '/home/.../domains/.../public_html/auth/key.pem ' 输入 PEM
。
到目前为止我尝试过的事情:
- 按照此处的建议检查 key 文件是否可读:Unable to use libcurl to access a site requiring client authentication .尝试通过
openssl_private_key()
传递文件给了我一个资源,而不是一个 bool 值。所以这看起来不错。 - 按照此处的建议切换 key.pem 文件中内容的顺序:Unable to use libcurl to access a site requiring client authentication .到目前为止运气不好。
- 尝试了一些其他选项,如
SLL_VERIFY_PEER
、SSL_VERIFY_HOST
、SSL_CERTTYPE
和其他选项,这些选项对于官方 PHP 文档来说似乎微不足道。到目前为止运气不好。
我很确定问题出在我的配置中,但我不确定去哪里找。
最佳答案
我已经解决了这个问题。我认为,由于有关此问题的问题数量和不同解决方案的数量,其他人将从该解决方案中受益。开始了:
我使用 openssl
CLI 程序将 .p12 key 文件转换为 .pem key 文件。诀窍在于转换发生的方式。
首先我用这个命令转换它,我遇到了问题中描述的问题:
openssl pkcs12 -in key.p12 -out key.pem -nodes -clcerts
虽然下面的命令起到了真正的作用:
openssl pkcs12 -in key.p12 -out key.pem -clcerts
有关更多信息,请参阅我使用的来源:https://community.qualys.com/docs/DOC-3273
关于php - 带有 SSL 证书的 cURL 失败 : error 58 unable to set private key file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27102176/