【问题标题】:Curl Error: could not load PEM client certificate卷曲错误:无法加载 PEM 客户端证书
【发布时间】:2018-11-24 05:07:21
【问题描述】:

我正在尝试通过传递证书使用 PHP curl 发送 GET 请求

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
curl_setopt($ch, CURLOPT_POST, True);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$pemFile = tmpfile();
fwrite($pemFile, "demo-cert.p12");//the path for the pem file
$tempPemPath = stream_get_meta_data($pemFile);
$tempPemPath = $tempPemPath['uri'];
curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath);
$result = curl_exec($ch);
if(!$result)
{
    echo "Curl Error: " . curl_error($ch);
}
else
{
    echo "Success: ". $result;
}

但不知道如何传递“密码”所以我收到此错误

Curl Error: could not load PEM client certificate, OpenSSL error error:0906D06C:PEM 
routines:PEM_read_bio:no start line, (no key found, wrong pass phrase, or wrong file format?)

[更新]

将 demo-cert.p12 更改为 demo-cert.pem,它与 php 文件一起存在,但由于未发送密码,仍然遇到相同的问题。证书文件夹包含其他2个文件:demo-combined.pem和demo-key.pem,但首先需要发送密码。

[更新2]

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
curl_setopt($ch, CURLOPT_POST, True);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSLCERT, 'demo-key.pem');
curl_setopt($ch, CURLOPT_SSLKEY, 'demo-cert.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'pass');
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, 'pass');

这些文件与 PHP 文件存储在同一目录中。还是出现同样的错误

[更新 3]

如何编辑代码以同时发送服务器证书?

curl --show-error --verbose --cacert server-cert.pem --cert cert2.pem

curl_setopt($ch, CURLOPT_SSLCERT, 'demo-cert.pem');
curl_setopt($ch, CURLOPT_SSLKEY, 'demo-key.pem');

结果是:

Success: SOAP-ENV:ClientData required for operation

在浏览器中打开相同的 URL 时未返回 XML 数据。有什么问题吗?

【问题讨论】:

  • 好吧,看来您将字符串 "demo-cert.p12" 写入 pem 文件而不是 p12 文件的内容。我认为您必须将 p12 证书转换为真正的 pem 证书。您可以查看这个 stackoverflow-question 以了解这是如何完成的:stackoverflow.com/questions/24363317/… - 您也可以选择删除密码,但如果您想使用密码,您可以使用 curl 选项 CURLOPT_KEYPASSWD
  • 已更新。将 demo-cert.p12 替换为 demo-cert.pem
  • 代码再次更新
  • pem 文件看起来如何,它们是否有像 -----BEGIN CERTIFICATE----- 这样的标题?
  • 开头的一些数据如版本、序列号等信息然后-----BEGIN CERTIFICATE-----

标签: php curl ssl-certificate


【解决方案1】:

首先将“CURLOPT_POST”从 True 更改为 False。第二次将“CURLOPT_SSLCERT”值与“CURLOPT_SSLKEY”值交换以发送正确的证书和密钥文件名感谢@vstm,现在我得到了正确的结果。

谢谢大家。

【讨论】:

    【解决方案2】:

    由于您使用的是文件名 - 请尝试使用绝对路径。您不需要将密钥和证书都转换为 PEM。只需使用同时具有证书和密钥的 Single .PEM 文件。

    例如

    curl_setopt($ch, CURLOPT_SSLCERT, 'c:/wamp64/www/bit-tool/www/testcert.pem');
    

    【讨论】:

      猜你喜欢
      • 2017-02-03
      • 2021-01-16
      • 2019-03-18
      • 2019-05-19
      • 2023-04-02
      • 2018-02-02
      • 1970-01-01
      • 2013-10-16
      相关资源
      最近更新 更多