Php Curl错误:无法加载PEM客户端证书

Php Curl错误:无法加载PEM客户端证书,php,curl,ssl-certificate,Php,Curl,Ssl Certificate,我试图通过传递证书来使用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_VERBOS

我试图通过传递证书来使用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数据。有什么问题吗?

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

谢谢大家。

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


谢谢大家。

因为您使用的是文件名-请尝试绝对路径。您不需要将密钥和证书都转换为PEM。只需使用一个既有证书又有密钥的.PEM文件

e、 g


由于您使用的是文件名,请尝试使用绝对路径。您不需要将密钥和证书都转换为PEM。只需使用一个既有证书又有密钥的.PEM文件

e、 g


您似乎将字符串
“demo-cert.p12”
写入pem文件,而不是p12文件的内容。我认为您必须将p12证书转换为真正的pem证书。您可以查看此stackoverflow问题以了解如何操作:-您也可以选择删除密码,但如果您想使用密码,可以使用curl选项
CURLOPT\u KEYPASSWD
。已更新。将demo-cert.p12替换为demo-cert.pemCode重新更新pem文件的外观如何?它们是否有类似于
----开始证书------
?开始时的一些数据,如版本、序列和其他信息------开始证书------似乎您编写了字符串
“demo-cert.p12”
,而不是p12文件的内容。我认为您必须将p12证书转换为真正的pem证书。您可以查看此stackoverflow问题以了解如何操作:-您也可以选择删除密码,但如果您想使用密码,可以使用curl选项
CURLOPT\u KEYPASSWD
。已更新。将demo-cert.p12替换为demo-cert.pemCode重新更新pem文件的外观如何?它们是否有类似于
----开始证书---
的头文件?开始时的一些数据,如版本、序列和其他信息,然后------开始证书-----
curl_setopt($ch, CURLOPT_SSLCERT, 'c:/wamp64/www/bit-tool/www/testcert.pem');