通过。PEM 和 .KEY 作为字符串在 Curl 中使用 PHP

2022-08-30 19:00:27

我有一个CERT和私钥文件。我正在使用cUrl和PHP连接到另一个服务。目前,我已经认证并输入了文件,并且可以使用以下代码完全正常工作:

$pemfile = "cert.pem";
$keyfile = "private_key.key";
$url = "someTestUrl";
$requestXml = "requestData";

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); 
curl_setopt($ch, CURLOPT_FAILONERROR, 1); 
curl_setopt($ch, CURLOPT_SSLCERT, $pemfile); 
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM'); 
curl_setopt($ch, CURLOPT_SSLKEY, $keyfile); 
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestXml);
$ret = curl_exec($ch);

我的问题是:我可以将证书和密钥作为字符串传递,而不是将它们作为文件传递吗?我尝试简单地将相应文件的内容作为字符串传递,如下所示:

$pemfile = "-----BEGIN CERTIFICATE-----CERTDATAASSTRING-----END CERTIFICATE-----";
$keyfile = "-----BEGIN RSA PRIVATE KEY-----PRIVATEKEYINCODE-----END RSA PRIVATE KEY-----";

...不用说...它不起作用:(

有什么想法吗?指针?建议???


答案 1

不幸的是,答案既简单又简单:不,这是不可能的。

底层的libcurl实际上有一个API,用于直接从内存中提供密钥和证书,但PHP / CURL扩展仅支持将它们作为文件提供!

奖励材料:

如果你确定你的libcurl是用OpenSSL构建的,你实际上可以使用CURLOPT_SSL_CTX_FUNCTION选项来做到这一点。然而:

  1. 这使它成为一个libcurl + OpenSSL特定的解决方案

  2. 我不认为PHP / CURL公开了这个函数(足够)来允许这样做。您可能需要先扩展绑定代码...

(我应该补充一点,我是libcurl的主要作者和维护者。


答案 2

使用可能足以作为解决方法。tmpfile()

$tempPemFile = tmpfile();
fwrite($tempPemFile, $pemfile);
$tempPemPath = stream_get_meta_data($tempPemFile);
$tempPemPath = $tempPemPath['uri'];

然后:

curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath); 

但请确保在之后关闭它,以便删除tmp文件

fclose($tempPemFile);

推荐