我正在尝试使用 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' type PEM
。
到目前为止我尝试过的事情:
- 检查密钥文件是否可读,如此处建议:无法使用 libcurl 访问需要客户端身份验证的站点。尝试通过
openssl_private_key()
传递文件会给我一个资源,而不是布尔值。所以这看起来不错。 - 按照以下建议切换 key.pem 文件中内容的顺序:无法使用 libcurl 访问需要客户端身份验证的站点。到目前为止没有运气。
- 玩了一些其他选项,如
SLL_VERIFY_PEER
,SSL_VERIFY_HOST
,SSL_CERTTYPE
和其他选项,这些选项在官方PHP文档中似乎微不足道。到目前为止没有运气。
我很确定问题出在我的配置中,但我不确定在哪里查找。
我已经解决了这个问题。我认为,由于有关此问题的问题数量和不同解决方案的数量,其他人将从解决方案中受益。这里是:
我使用 openssl
CLI 程序将 .p12 密钥文件转换为 .pem 密钥文件。诀窍是转换发生的方式。
首先,我使用此命令对其进行了转换,并且遇到了问题中所述的问题:
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
以防万一这对搜索此问题的其他人有用,我最终发现CURLOPT_SSLCERT和CURLOPT_SSLKEY似乎不适用于相对路径。
这是在Windows上的WAMP,php版本5.5。
我在使用curl
和搜索发现这个问题时遇到了同样的错误。 我正在使用命令curl --key my.pem https://example.com/
我有用的解决方案是添加--cert
选项并指向相同的 PEM 文件。 显然,PEM 文件(在我的情况下)既有密钥也有证书。
我用 curl 命令对其进行了测试:
curl --cert my.pem --key my.pem https://example.com/my/url