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

Posted

技术标签:

【中文标题】带有 SSL 证书的 cURL 失败:错误 58 无法设置私钥文件【英文标题】:cURL with SSL certificates fails: error 58 unable to set private key file 【发布时间】:2015-01-22 00:11:45 【问题描述】:

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

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

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

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

【问题讨论】:

"切换key.pem中内容的顺序"。您的 key.pem 文件(包含私钥)应该只包含 1 个 PEM 编码部分(用于私钥)。这是您可能需要更改的证书文件的顺序。此私钥的客户端证书应位于顶部。 【参考方案1】:

我已经解决了这个问题。我认为,由于有关此问题的问题数量和不同解决方案的数量,其他人将从解决方案中受益。如下:

我使用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

【讨论】:

-nodes 删除密钥上的加密,在这种情况下可能会与您尝试使用密码发生冲突。 感谢您提供更多信息。我没有意识到这一点。 帮我搞定了!经过几天的坚持!谢谢 似乎这个页面可以解释命令行选项:openssl.org/docs/manmaster/man1/openssl-pkcs12.html【参考方案2】:

以防万一这对搜索此问题的其他人有用,我最终发现 CURLOPT_SSLCERT 和 CURLOPT_SSLKEY 似乎不适用于相对路径。

这是 WAMP,Windows 上的 php 版本 5.5。

【讨论】:

以上是关于带有 SSL 证书的 cURL 失败:错误 58 无法设置私钥文件的主要内容,如果未能解决你的问题,请参考以下文章

cURL 错误 60:SSL 证书问题:证书已过期

libcurl证书验证失败

使用带有 SSL 证书的 PHP cURL 时出错

facebook auth cURL 错误 60:SSL 证书

PayPal IPN 侦听器 - SSL 证书握手失败

WORDPRESS : cURL 错误 60: SSL 证书