使用PHP将.PEM和.KEY作为字符串传递给Curl

时间:2011-10-31 19:48:01

标签: php ssl curl https ssl-certificate

我有一个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);

我的问题是:我可以将cert和key作为字符串传递而不是将它们作为文件传递吗?我试着简单地将各个文件的内容作为字符串传递:

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

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

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

4 个答案:

答案 0 :(得分:22)

遗憾的是答案很简单:不,这是不可能的。

底层libcurl没有用于将键作为字符串提供的API,仅作为文件!

奖励材料:

如果您确定您的libcurl是使用OpenSSL构建的,您实际上可以使用CURLOPT_SSL_CTX_FUNCTION选项来执行此操作。但是:

  1. 使其成为libcurl + OpenSSL特定解决方案

  2. 我认为PHP / CURL不会公开那个功能(足够)来允许这个。您可能需要首先扩展绑定代码...

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

答案 1 :(得分:10)

使用tmpfile()可能就足够了。

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

然后:

curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath); 

但请确保在tmp文件删除后关闭它

fclose($tempPemFile);

答案 2 :(得分:3)

您可以创建临时文件,将字符串写入文件,然后指向临时文件......

答案 3 :(得分:0)

我不是SSL专家,但CURLOPT_SSLKEY是CURLOPT_SSLCERT public.pem文件的private.pem文件?

我的参数

CURLOPT_CAINFO => /path/cacert.pem
CURLOPT_SSLKEY => /path/private.pem
CURLOPT_SSLCERT => /path/public.pem

尝试我建议的答案,如果有帮助请告诉我。