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

2022-08-30 07:42:25

我尝试将 curl 请求与我正确的APP_ID、APP_SECRET等发送到

  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。为什么它不适用于卷曲?请帮忙。


答案 1

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

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

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

然后在 php 中设置.ini

curl.cainfo = <absolute_path_to> cacert.pem

如果在运行时设置它,请使用(其中):$ch = curl_init();

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

答案 2

此解决方法是危险的不建议:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

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

实际上,您只需要一个最新的 CA 根证书捆绑包。安装更新的一个就像:

  1. cURL 网站下载最新文件,以及cacert.pem

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

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

就是这样!

保持安全可靠。


推荐