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

Vic*_*sky 63 php curl oauth vk

我尝试用正确的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 
Run Code Online (Sandbox Code Playgroud)

我需要从它获取access_token,但得到一个FALSE并curl_error()打印下一条消息,否则:

60: SSL certificate problem: self signed certificate in certificate chain
Run Code Online (Sandbox Code Playgroud)

我的代码是:

    // 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;
Run Code Online (Sandbox Code Playgroud)

当我手动移动到上面的链接时,我得到了access_token.为什么它不适用于卷曲?请帮忙.

erl*_*sec 155

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

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

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

然后在php.ini中设置:

curl.cainfo = <absolute_path_to> cacert.pem
Run Code Online (Sandbox Code Playgroud)

如果您在运行时设置它,请使用:

curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,在 PHP 7.1/7.2 中,curl.cainfo 不会出现在 phpinfo() 中,但 openssl.cafile 会出现。https://www.php.net/manual/en/curl.configuration.php (2认同)

zxc*_*ran 51

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Run Code Online (Sandbox Code Playgroud)

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

实际上,您只需要一个最新的CA根证书包.安装更新的版本非常简单:

  1. 下载了最新cacert.pem的文件卷曲网站
  2. 在php.ini文件中设置它的路径,例如在Windows上:

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

而已!

保持安全.

  • 你也可以在你的代码,如果你没有编辑全局`php.ini`文件的权限设置此选项:`curl_setopt($ curl_ch,CURLOPT_CAINFO,目录名(__ FILE __) "/ cacert.pem");` (5认同)
  • @miken32 是的,然后我建议使用替代的安全解决方案来替代危险的解决方法。继续阅读直到最后。 (4认同)
  • 在开发环境中工作 (2认同)
  • 适用于在dev env上进行测试 (2认同)
  • 这是一个可怕的建议,应该删除答案。 (2认同)

小智 5

如果您的系统中未正确安装 SSL 证书,您可能会收到此错误:

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

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

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

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

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