bia*_*nca 17 php ssl https curl 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);
Run Code Online (Sandbox Code Playgroud)
我的问题是:我可以将cert和key作为字符串传递而不是将它们作为文件传递吗?我试过简单地将各个文件的内容作为字符串传递:
$pemfile = "-----BEGIN CERTIFICATE-----CERTDATAASSTRING-----END CERTIFICATE-----";
$keyfile = "-----BEGIN RSA PRIVATE KEY-----PRIVATEKEYINCODE-----END RSA PRIVATE KEY-----";
Run Code Online (Sandbox Code Playgroud)
......并且不用说......它不起作用:(
有任何想法吗?指针?建议???
Dan*_*erg 24
不幸的是,答案很简单:不,这是不可能的.
底层libcurl没有用于将键作为字符串提供的API,仅作为文件!
奖金材料:
如果您确定您的libcurl是使用OpenSSL构建的,那么您实际上可以使用CURLOPT_SSL_CTX_FUNCTION选项来执行此操作.然而:
这使它成为libcurl + OpenSSL特定的解决方案
我不认为PHP/CURL暴露了那个功能(足够)允许这个.您可能需要首先扩展绑定代码...
(我应该补充一点,我是libcurl的主要作者和维护者.)
MDr*_*tte 11
使用tmpfile()可能足以作为一种解决方法.
$tempPemFile = tmpfile();
fwrite($tempPemFile, $pemfile);
$tempPemPath = stream_get_meta_data($tempPemFile);
$tempPemPath = $tempPemPath['uri'];
Run Code Online (Sandbox Code Playgroud)
然后:
curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath);
Run Code Online (Sandbox Code Playgroud)
但请确保在删除tmp文件后关闭它
fclose($tempPemFile);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18452 次 |
| 最近记录: |