带有 SSL 证书的 cURL 失败:错误 58 无法设置私钥文件


cURL with SSL certificates fails: error 58 unable to set private key file

我正在尝试使用 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));

我不断得到的结果是错误58unable to set private key file: '/home/.../domains/.../public_html/auth/key.pem' type PEM

到目前为止我尝试过的事情:

  • 检查密钥文件是否可读,如此处建议:无法使用 libcurl 访问需要客户端身份验证的站点。尝试通过openssl_private_key()传递文件会给我一个资源,而不是布尔值。所以这看起来不错。
  • 按照以下建议切换 key.pem 文件中内容的顺序:无法使用 libcurl 访问需要客户端身份验证的站点。到目前为止没有运气。
  • 玩了一些其他选项,如SLL_VERIFY_PEERSSL_VERIFY_HOSTSSL_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