下载了 PEM 证书,但仍然“无法获得本地颁发者证书”
Posted
技术标签:
【中文标题】下载了 PEM 证书,但仍然“无法获得本地颁发者证书”【英文标题】:Downloaded PEM cert but still getting "unable to get local issuer certificate" 【发布时间】:2015-06-10 13:10:54 【问题描述】:我正在尝试创建一个代理服务器,我将在其中使用 curl 从 API 请求 JSON 对象。除了认证,我已经能够成功地完成这项工作。
<?php
error_reporting(E_ALL);
$url = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20csv%20where%20url%3D'http%3A%2F%2Ffinance.yahoo.com%2Fd%2Fquotes.csv%3Fs%3DMSFT%2BFFIV%26f%3Dnab'&format=json&diagnostics=true&callback=";
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "\VeriSignClass3PublicPrimaryCertificationAuthority-G5.crt");
// Perform the request, and save content to $result
$result = curl_exec($ch);
if(curl_errno($ch))
echo 'Curl error: ' . curl_error($ch);
else
echo $result;
exit();
?>
我已经下载了 yahooapis 认证 PEM 文件(带和不带链)并将其放在与 proxy.php 文件相同的文件夹级别,但我仍然收到错误“无法获取本地颁发者证书” .
关于可能缺少什么的任何想法?
另外,请不要建议将 CURLOPT_SSL_VERIFYPEER 设置为 false,因为我知道这会绕过验证。我需要服务器在连接之前进行验证。
谢谢!
【问题讨论】:
【参考方案1】:curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "\VeriSignClass3PublicPrimaryCertificationAuthority-G5.crt");
我不认为这是正确的。您需要指纹为 74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74 的 G3 而不是 G5 证书: E2。 G5 证书将无法与带有 query.yahooapis.com 使用的设置的 OpenSSL 堆栈一起使用,因为 OpenSSL 的替代信任路径存在问题。更多详情请查看http://kriscience.blogspot.de/2013/03/supporting-trusted-but-untrusted.html。
【讨论】:
我下载了G3证书,指纹确实不一样。您是否碰巧有一个链接到另一个我可以测试的具有此指纹/证书的公共 API?只要是 JSON,输出是什么都没关系。 不,我不知道任何其他 API。以上是关于下载了 PEM 证书,但仍然“无法获得本地颁发者证书”的主要内容,如果未能解决你的问题,请参考以下文章
第一个 Data Patament 网关 - 在下载中心没有下载“数字证书”(.PEM) 文件的选项
markdown 使用OpenSSL下载PEM证书并导入Java TrustStore