簡體   English   中英

PHP CURL和SSL證書(或證書鏈)

[英]PHP CURL and SSL certificate (or cert chain)

美好的一天!

我有REST API,可通過SSL(https://)訪問。 我想將正確的證書(或證書鏈)以及編寫為PHP和CURL的腳本一起提出請求。

這是我的目標( http://api.vkontakte.ru )中的證書在Firefox中的外觀:

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

這是來自Firefox的已保存“ PEM格式的證書鏈X.509”的摘錄(在此處進行了描述: 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 init的代碼示例:

$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證書。

我嘗試過的:

  • 我已驗證使用了我的證書文件,因為當我指定錯誤的路徑時,它會抱怨找不到證書(錯誤70)

  • 我已經與Facebook SDK及其證書鏈進行了核對,證明我的CURL可用於此類設置

  • 我試圖導出不同的鏈(包括或不包括)鏈中的最后一個證書

  • 嘗試過CURLOPT_SSL_VERIFYHOST => 1

歡迎任何想法!

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

  1. 在firefox中打開https://vk.com/
  2. 將此站點的證書鏈導出為X.509
  3. 將目標網址從http://api.vkontakte.ru更改為https://api.vk.com/

這是我的帶有curl選項的代碼:

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是帶有導出證書鏈的文件。

Curl在服務器上與系統其余部分(如台式機)不同的位置使用CA證書。 我之前必須將CA證書安裝到文件系統中。 PHP libcurl將使用命令行實用程序也使用的庫。 請參閱http://curl.haxx.se/docs/sslcerts.html

這些步驟似乎起作用:

  1. 在firefox中訪問https網址
  2. 單擊綠色欄,單擊箭頭,然后單擊“更多信息”。
  3. 單擊“查看證書”,然后單擊頂部的“詳細信息”選項卡
  4. 然后單擊每個級別並導出每個證書:

    根CA

    服務器CA

    example-website.invalid

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

將該pem文件復制到PHP可以訪問的目錄中,理想情況下,該文件具有644權限。您甚至可以使用444來防止篡改,並在需要更新時將其更改為644。

然后更新代碼中的路徑,例如:

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

警告:當網站更新其SSL證書時,以上文件可能已過期,並且HTTPS cURL調用可能失敗,從而破壞了您的應用程序。 希望有人會在這里回答一個自動更新此文件的好方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM