我有一个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-----";
......并且不用说...它不起作用:(
有什么想法吗?指针?建议???
答案 0 :(得分:22)
遗憾的是答案很简单:不,这是不可能的。
底层libcurl没有用于将键作为字符串提供的API,仅作为文件!
奖励材料:
如果您确定您的libcurl是使用OpenSSL构建的,您实际上可以使用CURLOPT_SSL_CTX_FUNCTION选项来执行此操作。但是:
使其成为libcurl + OpenSSL特定解决方案
我认为PHP / CURL不会公开那个功能(足够)来允许这个。您可能需要首先扩展绑定代码...
(我应该补充一点,我是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
尝试我建议的答案,如果有帮助请告诉我。