CurlException: [curl] 51: SSL: 证书验证失败

Posted

技术标签:

【中文标题】CurlException: [curl] 51: SSL: 证书验证失败【英文标题】:CurlException: [curl] 51: SSL: certificate verification failed 【发布时间】:2014-10-14 22:48:50 【问题描述】:

不知道可能是什么:

在我的本地环境中,将我的 OSX 更新到 Yosemite 的最新版本后,我收到此错误:

CurlException: [curl] 51: SSL: certificate verification failed (result: 5) [url] 

我使用的是 Symfony2,所以它与 php 有关。我试图重新安装 openssl 但没有任何反应。

有什么建议吗?

【问题讨论】:

我发现所有基于 PHP 的 SSL 都失败了(并且从 Beta 2 开始就失败了)。还没有找到解决办法;有兴趣知道您是否可以找到解决方案。 我认为这是 cURL 和 Yosemite 的错误。在命令行中尝试curl --cacert /path/to/cert.pem https://url。我得到相同的“51”错误。告诉 PHP 不要设置证书似乎对我有用。看看github.com/guzzle/guzzle/issues/819 【参考方案1】:

已经有人问过类似问题,请看这里:HTTPS and SSL3_GET_SERVER_CERTIFICATE:certificate verify failed, CA is OK

另外,这里有一篇文章:http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/

【讨论】:

我已经尝试过这些解决方案,但没有奏效。然而,此刻我发现了一个小技巧(见下面的答案)。【参考方案2】:

尝试将 curl 从 7.37.1(beta2 附带)降级到 7.37.0

【讨论】:

【参考方案3】:

添加这些选项以忽略证书:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

【讨论】:

【参考方案4】:

查看出现此错误的任何域的证书链。对我来说是 googleapis.com

openssl s_client -host www.googleapis.com -port 443

你会得到这样的东西:

CONNECTED(00000005)
depth=1 C = US, O = Google Trust Services, CN = Google Internet Authority G3
verify error:num=20:unable to get local issuer certificate
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Trust Services/CN=Google Internet Authority G3
 1 s:/C=US/O=Google Trust Services/CN=Google Internet Authority G3
   i:/OU=GlobalSign Root CA - R2/O=GlobalSign/CN=GlobalSign

注意:我在解决问题后捕获了这个。此外,您的链输出看起来会有所不同。

然后你需要查看在apache下运行的php中允许的证书。在页面中运行 phpinfo()。

<?php echo phpinfo();

然后通过在页面中搜索openssl.cafile 来查找从页面输出中加载的证书文件:

openssl.cafile openssl.cafile /usr/local/php5/ssl/certs/cacert.pem

这是您需要通过添加正确的证书来修复的文件。

sudo nano /usr/local/php5/ssl/certs/cacert.pem

您基本上需要将正确的证书“签名”附加到此文件的末尾。

你可以在这里找到其中的一些:

https://pki.google.com/ https://www.geotrust.com/resources/root-certificates/index.html

它们看起来像这样:

注意:这是一张图片,因此人们不会简单地从 *** 复制/粘贴证书

如果您需要将 .crt 转换为 pem,您需要执行以下操作:

openssl x509 -inform DER -outform PEM -in GIAG2.crt -out GIA2.pem

在此文件中包含正确的证书后,重新启动 apache 并进行测试。

【讨论】:

【参考方案5】:

解决此问题的方法是取消设置 SSL_CERT_FILE

的值

运行命令:

export SSL_CERT_FILE=""

然后尝试执行所需的操作,它会正常工作。

参考:Curl 'certificate verification failed' on mac

【讨论】:

以上是关于CurlException: [curl] 51: SSL: 证书验证失败的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的 CurlException:77:设置证书验证位置时出错

Facebook CurlException 3 没有设置 URL

致命错误:未捕获的 CurlException:7:无法连接到第 887 行 ....src/base_facebook.php 中抛出的主机

Curl:修复 CURL (51) SSL 错误:没有替代证书主题名称匹配

解决curl中errno为51和60的错误

为 Nexus 容器启用 HTTPS 后,CURL 上传/下载错误并显示以下错误: curl: 51 SSL: no alternative certificate