2014-01-17 99 views
35

我试图用我的正确APP_ID,APP_SECRET等发送卷曲请求卷曲错误60,SSL证书问题:在证书链自签名证书

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

我需要从它那里得到的access_token,但得到虚假信息和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。为什么它不适用于卷曲?请帮助。

+0

也许我需要获得带'.crt'扩展名的证书?但我不知道如何让他 –

+1

请避免[破]接受的答案。改为使用@ erlangsec的答案。另请参阅[世界上最危险的代码:在非浏览器软件中验证SSL证书](http://crypto.stanford.edu/~dabo/pubs/abstracts/ssl-client-bugs.html)。 – jww

回答

97

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

错误可能是由于没有最新的CA根证书包而导致的。这通常是一个文本文件,包含一系列curl用于验证主机SSL证书的加密签名。

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

然后set in php.ini

curl.cainfo = <absolute_path_to> cacert.pem 

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

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

谢谢,但我一直在寻找与外部API工作建议,因此建议,即建议@SabujHassan是工作,如我。理解,API,我用,不提供SSL。 –

+5

这应该是公认的答案! – plocks

+0

工作就像一个魅力!谢谢! – ViaSat

22

由于协议为https,对于开发模式,您可以设置此curl选项以避免ssl验证错误作为快速解决方案。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

但是对于您的生产环境,请勿使用此简单修补程序进行部署。这会导致您的安全问题,因为数据传输在网络层之间是透明的。从以下网址查看部分适当修复

http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/

+1

我已经找到自己了,谢谢! ) –

+15

这样做不仅可以避免SSL验证错误,还可以避免验证SSL证书是否有效,从而避免验证您是否实际与要连接的任何人连接。 (基本上是否定SSL连接的许多安全性) –

+3

如果您处于生产环境中,则不应使用curl_setopt($ ch,CURLOPT_SSL_VERIFYPEER,false); – lukaserat

-6

不要在生产中使用此解决方法!仅用于开发目的

我找到了答案,你需要禁用SSL验证:

// 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, TRUE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 

// $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; 

,它的效果很好!谢谢大家:)

+1

这不是一个安全的做法应该停用SSL等认证 –

2

嘿,伙计们:非常重要!这个问题使我疯狂了几天,我无法弄清楚我的curl & openssl安装发生了什么。我终于发现这是我过期的证书(在我的情况下,GoDaddy)。我回到了我的godaddy SSL管理面板,下载了新的中间证书,问题消失了。

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

显然,GoDaddy的在某些时候改变了他们的中间证书,由于scurity问题,因为他们现在显示该警告:

“请务必使用包含在您下载捆绑新的SHA-2中间证书“。

希望这有助于你们中的一些,因为我要去坚果和这个清理我所有的服务器上的问题......

+0

虽然与问题不完全相关,但它可能会提供一个可行的信息。 – nop77svk

+0

curl生成的错误消息有时可能是神秘的,误导性的,我相信有些获得“自签名证书”错误的人会因为我引用的怪癖而得到它。我还想补充一点,在构建curl时,我使用了configure字符串:./configure --with-ca-bundle =/etc/ssl/certs/ca-bundle.crt,并且我还使用了perl脚本lib/mk -ca-bundle.pl生成一个不错的新鲜ca-bundle.crt文件。我使用的是Apache Web服务器,但我没有用godaddy的更新版本取代现有的中间证书。 – Lee

29

这个解决办法是危险不建议

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

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

实际上,您只需要一个最新的CA根证书包。安装更新的一个是那么容易,因为:

  1. 下载从cURL website了最新cacert.pem文件和
  2. 在php.ini文件中设置它的路径,例如在Windows上:

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

这就是它!

保持安全。

+5

你可以在你的代码,如果你没有编辑全局'php.ini'文件的权限也设置此选项: 'curl_setopt($ curl_ch,CURLOPT_CAINFO,目录名(__ FILE __) “/ cacert.pem”); ' – zxcmehran

+0

在dev环境下工作 – cmedeiros

+0

适合在dev env上测试 –

0

如果SSL证书不正确安装在你的系统,你可能会得到这样的错误:

下载一个文件,证书的更新列表:

cURL error 60: SSL certificate problem: unable to get local issuer certificate.

可以按如下方式解决这个问题从https://curl.haxx.se/ca/cacert.pem

移动下载cacert.pem文件到一些安全的位置在您的系统

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

相关问题