如何通过 PHP 发送带有 pem 证书的 curl 请求?
Posted
技术标签:
【中文标题】如何通过 PHP 发送带有 pem 证书的 curl 请求?【英文标题】:How to send a curl request with pem certificate via PHP? 【发布时间】:2016-02-26 02:32:48 【问题描述】:我的 Apache 服务器中有一个 php 脚本,它必须向合作伙伴的服务器发送 curl 请求。 合作伙伴给我一个 .pem 文件,我必须将其附加到我对其 api 进行的每次调用中。
我的 php 脚本如下:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSLCERT, "test.pem" );
curl_setopt($ch,CURLOPT_SSLCERTTYPE,"PEM");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
curl_setopt($ch, CURLOPT_POST, True);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$result = curl_exec($ch);
if(!$result)
echo "Curl Error: " . curl_error($ch);
else
echo "Success: ". $result;
curl_close($ch);
返回:
Curl 错误:无法设置私钥文件:'test.pem' 类型 PEM
考虑到它向我发送 .pem 文件并说“它没有密码”
【问题讨论】:
【参考方案1】:我认为您需要使用tmpfile() 和stream_get_meta_data。
$pemFile = tmpfile();
fwrite($pemFile, "test.pem");//the path for the pem file
$tempPemPath = stream_get_meta_data($pemFile);
$tempPemPath = $tempPemPath['uri'];
curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath);
来源:This answer here in SO 帮助我解决类似问题。
【讨论】:
嗨詹姆斯,非常感谢!!!我实现了代码,现在它报告:“Curl 错误:无法加载 PEM 客户端证书,OpenSSL 错误错误:0906D06C:PEM 例程:PEM_read_bio:没有起始行,(未找到密钥,密码错误或文件格式错误?) “你知道这意味着什么吗? 问题可能出在您的 pem 文件上。你是windows环境吗?看看这个query 是否对你有帮助。确保您的文件以-----BEGIN PUBLIC KEY-----
开头,没有空格。
非常感谢詹姆斯!【参考方案2】:
我想你不见了
curl_setopt($ch, CURLOPT_CAINFO, 'test.pem');
看看cURL is unable to use client certificate , in local server
有关通过 PHP 在 curl 中使用客户端证书的更多信息
【讨论】:
以上是关于如何通过 PHP 发送带有 pem 证书的 curl 请求?的主要内容,如果未能解决你的问题,请参考以下文章