下载了 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) 文件的选项

python_爬虫_Charles手机证书安装问题

markdown 使用OpenSSL下载PEM证书并导入Java TrustStore

Let's Encrypt ssl证书怎么下载?

问题是在Windows 7中为UBL Api安装.pem扩展安全证书

在 Tigase 服务器中加载 pem 证书文件