2014-01-17 270 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文件並配置該文件的路徑:

相關問題