2011-08-20 398 views
1

美好的一天!PHP CURL和SSL證書(或證書鏈)

我有可通過SSL(https://)訪問的REST API。我想把正確的證書(或證書鏈)連同我的腳本寫成PHP和CURL來提出請求。

下面是我的目標(http://api.vkontakte.ru)證書怎麼看起來像在Firefox:

http://speedcap.net/img/bc687485819715c65d6fe1e4ca1fdc40/1a2be.png

這裏是保存的「證書鏈X.509 PEM格式」從Firefox 片段(這裏所描述:http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/):

-----BEGIN CERTIFICATE----- 
MIIFVzCCBD+gAwIBAgIHKx5Ov2FOejANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE 
[..skip...] 
0npsf5fkvT8E13NgVY0PK6V/baMTlTgWXKQZ 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx 
[..skip...] 
qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV 
U+4= 
-----END CERTIFICATE----- 

這裏是CURL初始化的代碼例如:

$this->ch = curl_init(); 
    curl_setopt_array($this->ch, array(

     CURLOPT_TIMEOUT => 30, 
     CURLOPT_RETURNTRANSFER => TRUE, 
     CURLOPT_AUTOREFERER => TRUE, 
     CURLOPT_FOLLOWLOCATION => TRUE, 

     CURLOPT_SSL_VERIFYPEER => TRUE, 
     CURLOPT_SSL_VERIFYHOST => 2, 
     CURLOPT_CAINFO => <path to my cert>,   
    )); 

我有CURL錯誤60(CURLE_SSL_CACERT)抱怨wron cert。

我已經試過什麼:

  • 我覈實,我的證書文件被使用,因爲當我指定了錯誤的道路它抱怨找不到證書(誤差70)

  • 我已經與Facebook SDK和他們的證書鏈,我的工作捲曲這樣的設置

  • 我試圖導出不同的鏈(包括或不包括)的環比證書檢查

  • 試過CURLOPT_SSL_VERIFYHOST => 1

歡迎任何想法!

回答

1

Curl在服務器上的單獨位置使用CA證書,而不像系統其他部分那樣使用CA證書。我以前必須將CA證書安裝到文件系統中。 PHP libcurl也將使用命令行實用程序使用的庫。請參閱http://curl.haxx.se/docs/sslcerts.html

+0

謝謝,它適用於這個包:http://curl.haxx.se/docs/caextract.html。但是,我應該如何爲我的目標網站提取正確的證書? – artvolk

+0

我嘗試去掉那個ca文件只是爲了證明我在鏈中,它不起作用:( – artvolk

+0

,風選過程不是我以前試過的東西,它只要你拿出一個就失效了嗎?如果是這樣,它可能是一個格式問題,否則,你可能需要不斷嘗試。 –

3

幾年前,Vkontakte從vkontakte.ru域名轉移到了vk.com。他們也改變了他們的api處理程序網址。 這是我的解決方案:

  1. 在Firefox中打開https://vk.com/
  2. 導出證書鏈X.509此網站
  3. 更改目標URL從http://api.vkontakte.ruhttps://api.vk.com/

這是我的代碼捲曲選項:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_CAINFO, getcwd() ."/ffchainvk.crt"); // ok 

其中ffchainvk.crt是帶有導出的證書鏈的文件。

+0

謝謝你的後續行動,但在當時問題被問到,域vkontakte.ru仍然使用。我後來發現這個問題在不完整的證書鏈中en cert鏈是由firefox bundle(http://curl.haxx.se/docs/sslcerts.html)手工創建的。 – artvolk

+0

昨天我無法爲「vkontakte.ru」構建正確的鏈,但是使用來自Firefox的包,它按預期工作。另一個問題是,從Firefox的捆綁是相當大的(〜300kb)。你知道鏈中缺少哪個證書嗎? – msangel

+0

現在找不到這個文件,但它是根證書之一,我只是從firefox bundle中刪除證書,直到它停止工作。 – artvolk

0

這些是出現工作步驟:

  1. 請訪問HTTPS URL在Firefox
  2. 點擊綠色欄,單擊箭頭,然後單擊「詳細信息」
  3. 點擊「查看證書」然後單擊「詳細信息」選項卡在頂部
  4. 然後點擊每個級別和出口證書:

    根CA

    服務器CA

    例如,website.invalid

    您應該將所有三個文件保存到您的計算機上。將所有三個文件複製到一個文件中,例如custom_name_cert.pem

複製該PEM文件到一個目錄是用PHP訪問,理想的文件有權限644.你甚至可以去444,以防止篡改,並將其更改爲644,當你需要更新它。

然後在你的代碼更新的路徑,例如:

CURLOPT_CAINFO => '/var/www/certs/custom_name_cert.pem'

警告:當網站更新其SSL證書,上述文件可能會變得過時了,而HTTPS捲曲呼叫可能會失敗,打破你的申請。希望有人會在這裏回答一個很好的方法來自動更新這個文件。