php 使用SSL证书的cURL失败:错误58无法设置专用密钥文件

t9eec4r0  于 2023-01-16  发布在  PHP
关注(0)|答案(3)|浏览(271)

我正在尝试使用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.
目前为止我尝试过的方法:

  • 按照以下建议检查密钥文件是否可读:尝试通过openssl_private_key()传递文件给我一个资源,而不是布尔值,所以这看起来不错。
  • 按照以下建议切换密钥. pem文件中内容的顺序:Unable to use libcurl to access a site requiring client authentication.目前还没有运气。
  • 玩了一些其他的选项,如SLL_VERIFY_PEERSSL_VERIFY_HOSTSSL_CERTTYPE和其他选项,似乎微不足道的官方PHP文档。没有运气到目前为止。

我很肯定问题出在我的配置中,但我不知道该去哪里找。

pgky5nke

pgky5nke1#

我已经修复了这个问题。我认为,由于关于这个问题的问题和不同的解决方案的数量,其他人将受益于解决方案。
我使用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

edqdpe6u

edqdpe6u2#

为了防止这对其他搜索此问题的人有用,我最终发现CURLOPT_SSLCERT和CURLOPT_SSLKEY似乎不适用于相对路径。
这是与WAMP,php版本5.5在Windows上.

krcsximq

krcsximq3#

我在使用curl时和搜索时发现这个问题时得到了同样的错误。我使用的是命令curl --key my.pem https://example.com/
对我有效的解决方案是添加--key选项并指向同一个PEM文件。显然,PEM文件(在我的情况下)既有密钥也有证书。
我用curl命令进行了测试:

curl --cert my.pem  --key my.pem https://example.com/my/url

相关问题