如何通过 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 请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决错误“无法加载PEM客户端证书,OpenSSL错误:02001003:系统库:fopen:没有这样的过程”?

使用 pem 证书向远程代理发送消息

openssl:创建带有昵称的证书

如何将公钥从字符串类型转换为 PEM

pem 格式证书 怎么使用openssl

如何使用PEM格式的公钥创建证书对象?