Curl异常:[curl] 51:SSL证书验证失败。

9

无法弄清楚是什么原因:

在我的本地环境中,当我把OSX更新到Yosemite的最新版本后,出现了以下错误:

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

我正在使用Symfony2,所以它涉及到PHP。我尝试重新安装openssl,但没有任何变化。有什么建议吗?

我发现所有基于PHP的SSL都失败了(自Beta 2以来一直如此)。目前还找不到解决方案,如果您能找到解决方案,我很感兴趣。 - hellodaniel
我认为这是cURL和Yosemite的错误。请在命令行中尝试curl --cacert /path/to/cert.pem https://url。我得到了相同的“51”错误。告诉PHP不设置证书似乎对我有用。请查看https://github.com/guzzle/guzzle/issues/819。 - Jonny Barnes
5个回答

2
查看给出此错误的域的证书链。对我来说,它是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

您基本上需要将正确的证书“签名”附加到此文件的末尾。
您可以在此处找到其中一些: 它们长这样:

example certificate image

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

(注意:这是一个图片,所以人们不能简单地从stackoverflow复制/粘贴证书)

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

一旦正确的证书放入该文件中,重新启动Apache并进行测试。

1
解决此问题的方法是取消SSL_CERT_FILE的值。
运行命令:
export SSL_CERT_FILE=""

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

参考: Mac上Curl出现“证书验证失败”


1

我已经尝试过这些解决方案,但都没有起作用。然而,目前我发现了一个小技巧(请参见下面的答案)。 - marco.santonocito

0
尝试将curl从7.37.1(与beta2一起提供)降级到7.37.0。

-1

添加以下选项以忽略证书:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接