卷曲错误60,SSL证书问题:证书链中的自签名证书


79

我尝试将带有正确APP_ID,APP_SECRET等的curl请求发送到

  https://oauth.vk.com/access_token?client_id=APP_ID&client_secret=APP_SECRET&code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a&redirect_uri=REDIRECT_URI 

我需要从中获取access_token,但需要返回FALSE并curl_error()打印下一条消息:

60: SSL certificate problem: self signed certificate in certificate chain

我的代码是:

    // create curl resource
    $ch = curl_init();

    // set url
    curl_setopt($ch, CURLOPT_URL, $url);
    //return the transfer as a string
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // $output contains the output string
    $output = curl_exec($ch);
    if ( ! $output) {
        print curl_errno($ch) .': '. curl_error($ch);
    }

    // close curl resource to free up system resources
    curl_close($ch);

    return $output;

当我手动移动到上面的链接时,我会很好地获得access_token。为什么卷曲不起作用?请帮忙。


也许我需要获得.crt扩展证书?但我不知道该如何得到他
维克多·博沙尔斯基

1
请避免接受[破]的答案。请使用@erlangsec的答案。另请参阅世界上最危险的代码:在非浏览器软件中验证SSL证书
jww

Answers:


175

建议禁用的答案CURLOPT_SSL_VERIFYPEER不被接受。问题是“为什么它不适用于cURL”,正如Martijn Hols正确指出的那样,这很危险。

该错误可能是由于没有最新的CA根证书捆绑包引起的。这通常是带有一堆加密签名的文本文件,curl使用这些签名来验证主机的SSL证书。

您需要确保您的PHP安装中包含以下文件之一,并且文件是最新的(否则,请在此处下载一个文件:http : //curl.haxx.se/docs/caextract.html)。

然后在php.ini中设置

curl.cainfo = <absolute_path_to> cacert.pem

如果要在运行时进行设置,请使用:

curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");

1
谢谢,但是我一直在寻找有关使用外部API的建议。因此,建议@SabujHassan的建议是可行的,并且据我了解,我使用的API不提供SSL。
维克多·博沙斯基

优秀的解决方案。非常感谢您:)
Chandra Nakka

1
像魔术一样工作。这应该是答案,出于安全原因,“可接受的答案”很容易,但是是一种不好的方法。
KristCont

谢谢,正如所说的作品精湛!这确实应该是正确的答案。
PostMans

2
值得注意的是,curl.cainfo不会出现在PHP 7.1 / 7.2的phpinfo()中,openssl.cafile却可以。php.net/manual/zh-CN/curl.configuration.php
Elijah Lynn

56

此解决方法很危险不建议使用

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

禁用SSL对等验证不是一个好主意。这样做可能会将您的请求暴露给MITM攻击者。

实际上,您只需要一个最新的CA根证书捆绑包。安装更新的软件非常简单:

  1. cacert.pemcURL网站下载最新文件,并

  2. 在您的php.ini文件中设置路径,例如在Windows上:

    curl.cainfo=c:\php\cacert.pem

而已!

保持安全。


5
如果您无权编辑全局php.ini文件,也可以在代码中设置此选项: curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
zxcmehran 2015年

2
在开发环境中工作
cmedeiros,2015年

2
非常适合在开发环境中进行测试
Gaurav Rai 2016年

这是可怕的建议,应该删除答案。
miken32 '19

4
@ miken32是的,然后我建议一种替代的安全解决方案,以代替危险的解决方法。继续阅读直到结尾。
zxcmehran

3

大家好!非常重要!这个问题使我发疯了几天,而我无法弄清楚curl&openssl的安装是怎么回事。我终于发现这是我的中级证书(在我的情况下为GoDaddy)已过期。我回到了Godaddy SSL管理面板,下载了新的中间证书,然后问题消失了。

我确定这是某些人的问题。

显然,由于安全性问题,GoDaddy有时已更改了中间证书,因为它们现在显示以下警告:

“请确保使用下载的软件包中包含的新SHA-2中间证书。”

希望这对您有所帮助,因为我发疯了,这可以解决所有服务器上的问题...


尽管与问题不完全相关,但它通常可以提供可行的信息。
nop77svk 2014年

curl产生的错误消息有时可能是含糊不清且具有误导性,并且我确定有些人由于我引用的怪癖而收到了“自签名证书”错误。我还想补充一点,在构建curl时,我使用了配置字符串:./configure --with-ca-bundle = / etc / ssl / certs / ca-bundle.crt,我还使用了perl脚本lib / mk -ca-bundle.pl生成一个不错的新鲜ca-bundle.crt文件。我使用的是apache网络服务器,但没有用Godaddy更新的证书替换现有的中间证书。

3

如果您的系统中未正确安装SSL证书,则可能会出现以下错误:

cURL错误60:SSL证书问题:无法获取本地颁发者证书。

您可以按以下方式解决此问题:

https://curl.haxx.se/ca/cacert.pem下载包含更新的证书列表的文件

将下载的cacert.pem文件移到系统中的某个安全位置

更新您的php.ini文件并配置该文件的路径:


另外,您可能需要设置openssl.cafile="C:/dev/ssl/mywebsite.local.crt"­php.ini
弗朗索瓦·布列塔尼

-2

错误:SSL证书问题:证书链中的自签名证书

Solution:
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);    
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.