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

Php Curl错误60,SSL证书问题:证书链中的自签名证书,php,curl,oauth,vk,Php,Curl,Oauth,Vk,我尝试将带有正确应用程序ID、应用程序机密等的curl请求发送到 https://oauth.vk.com/access_token?client_id=APP_ID&client_secret=APP_SECRET&code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a&redirect_uri=REDIRECT_URI 我需要从中获取访问令牌,但获取FALSE和curl\

我尝试将带有正确应用程序ID、应用程序机密等的curl请求发送到

  https://oauth.vk.com/access_token?client_id=APP_ID&client_secret=APP_SECRET&code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a&redirect_uri=REDIRECT_URI 
我需要从中获取访问令牌,但获取FALSE和
curl\u error()
print next message,否则:

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;

当我手动移动到上面的链接时,我很好地获得了访问权。为什么卷曲不起作用?请提供帮助。

建议禁用
CURLOPT\u SSL\u VERIFYPEER
的答案不应被接受。问题是“为什么卷曲不起作用”,正如Martijn Hols正确指出的那样,它是危险的

该错误可能是由于没有最新的CA根证书束造成的。这通常是一个文本文件,其中包含一组加密签名,curl使用这些签名来验证主机的SSL证书

您需要确保您的PHP安装有其中一个文件,并且它是最新的(否则请在此处下载一个:)

然后:


重要提示:这个问题让我疯狂了好几天,我不知道我的curl和openssl安装到底发生了什么。我最终发现是我的中级证书(在我的例子中是GoDaddy)过期了。我回到我的godaddy SSL管理面板,下载了新的中间证书,问题消失了

我相信这是你们中一些人的问题

显然,GoDaddy在某个时候更改了他们的中级证书,因为他们现在显示以下警告:

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


希望这对你们中的一些人有所帮助,因为我快发疯了,这解决了我所有服务器上的问题。

此解决方法非常危险,不推荐使用

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
禁用SSL对等验证不是一个好主意。这样做可能会将您的请求暴露给MITM攻击者

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

  • 从和下载最新的
    cacert.pem
    文件

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

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

  • 就这样


    保持安全。

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

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

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

    从下载包含更新的证书列表的文件

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

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

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


    也许我需要一个扩展名为
    .crt
    的证书?但是我不知道怎么才能找到他请避免这个被接受的答案。改用@erlangsec的答案。另请参阅。谢谢,但我正在寻找一个使用外部API的建议。因此,建议@SabujHassan是可行的,而且,据我所知,我使用的API并不是提供SSL。它的工作方式很神奇。这应该是答案,“可接受的答案”很简单,但出于安全原因,这是一种不好的方法。我有一个Letsencrypt证书,可以与FileZilla一起使用,有没有办法让curl使用它呢?对我来说,它只在我将其设置为运行时时才起作用,当我在php.ini中设置路径时,它不起作用。值得注意的是,curl.cainfo没有出现在PHP7.1/7.2中的phpinfo()中,但openssl.cafile会出现。虽然与这个问题并不完全相关,但总体而言,它可能提供了一个可行的信息。curl生成的错误消息有时可能是隐晦的和误导性的,我相信一些获得“自签名证书”错误的人得到它是因为我引用了一个怪癖。我还想补充一点,在构建curl时,我使用了configure字符串:./configure--with ca bundle=/etc/ssl/certs/ca-bundle.crt,还使用了perl脚本lib/mk-ca-bundle.pl生成了一个新的ca-bundle.crt文件。我使用的是ApacheWeb服务器,但我没有用godaddy的更新证书替换现有的中间证书。如果您没有编辑全局
    php.ini
    file:
    curl\u setopt($curl\u ch,CURLOPT\u CAINFO,dirname(\u\u file\u)。“/cacert.pem”)的权限,也可以在代码中设置此选项适合在dev env上测试这是一个可怕的建议,答案应该被删除。@miken32是的,然后我建议一个替代的安全解决方案来替代危险的解决方法。一直读到最后。@AliKhosro当您在代码中初始化它时,它是从
    curl\u init()
    返回的curl资源处理程序。此外,您可能需要在php.ini中设置
    openssl.cafile=“C:/dev/ssl/mywebsite.local.crt”…
    curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
    
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    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);