【问题标题】:Downloaded PEM cert but still getting "unable to get local issuer certificate"下载了 PEM 证书,但仍然“无法获得本地颁发者证书”
【发布时间】: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,因为我知道这会绕过验证。我需要服务器在连接之前进行验证。

谢谢!

【问题讨论】:

    标签: php ssl curl


    【解决方案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。
    猜你喜欢
    • 2016-04-20
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 2016-03-01
    • 2015-01-17
    • 2021-07-17
    • 2019-03-19
    相关资源
    最近更新 更多