我正在尝试使用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
: 无法设置私钥文件:'/home/.../domains/.../public_html/auth/key.pem'类型为PEM
.
我已尝试的事情:
- 检查密钥文件是否可读,如此处建议:无法使用libcurl访问需要客户端身份验证的站点。尝试通过
openssl_private_key()
传递文件给我一个资源,而不是布尔值。所以这看起来很好。 - 按照此处建议,更改key.pem文件中内容的顺序:无法使用libcurl访问需要客户端身份验证的站点。到目前为止还没有运气。
- 玩弄一些其他选项,如
SLL_VERIFY_PEER
、SSL_VERIFY_HOST
、SSL_CERTTYPE
和其他在官方PHP文档中似乎微不足道的选项。到目前为止还没有运气。
我相信问题在我的配置中,但不确定该从哪里查找。
key.pem
文件内容的顺序”。您的key.pem
文件(包含私钥)应该只包含 1 个 PEM 编码部分(用于私钥)。需要更改的是证书文件的顺序。此私钥的客户端证书应位于顶部。 - Bruno