php - 卷曲错误:无法加载 PEM 客户端证书
问题描述
我正在尝试通过传递证书使用 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 更改为与 php 文件一起存在的 demo-cert.pem,但由于未发送密码,因此仍然出现相同的问题。证书文件夹包含其他 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,现在我得到了正确的结果。
谢谢你们。