2016-06-28 30 views
4

我看到有噸後的SO,有關錯誤:證書鋼釘與PHP捲曲

SSL certificate problem: unable to get local issuer certificate 

而且這是一個我得到。

所有他們的回答是剛從說下載根證書:

https://curl.haxx.se/ca/cacert.pem

並設置成CURLOPT_CAINFO或設置php.ini中的curl.cainfo。

但是,這樣做實際上只是告訴cURL信任根CA及其可信CA的列表。

從我的理解中,證書固定應該忽略所有這些根CA,並且只信任特定提供者的單個證書。

解決此錯誤的正確方法是什麼?

$ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);   
    curl_setopt($ch, CURLOPT_CAINFO, '/etc/httpd/static.gc.apple.com.pem'); 
    curl_setopt($ch, CURLOPT_CAPATH, '/etc/httpd/'); 

    //curl_setopt($ch, CURLOPT_PINNEDPUBLICKEY, "sha256//TeyzGG/8dvpuksAeSCb3tsvLEHbY6w9q63tXhOIf0Tg="); 
    $sslCertificate = curl_exec($ch); 

我知道與libcurl本身,它有一個選項「CURLOPT_PINNEDPUBLICKEY」這不完全是我需要的,但目前PHP還沒有在PHP支持它......(它沒有這樣的常數,我有不知道常數的實際值是多少)

+0

總是可以嘗試使用curl庫定義的'CURLOPT_PINNEDPUBLICKEY'的整數值,即使PHP沒有提供等效常量,請檢查[curl頭文件](https://github.com/curl/curl/ blob/master/include/curl/curl.h)。確保PHP使用的是支持它的cURL版本。 – apokryfos

+0

,關注@ apokryfos的角度來看,CURLOPT_PINNEDPUBLICKEY'的'值是230,因此嘗試: 'curl_setopt($ CH,230, 「SHA256 // TeyzGG/8dvpuksAeSCb3tsvLEHbY6w9q63tXhOIf0Tg =」);' – Carey

+0

@Carey從我在讀捲曲apokryfos發佈的標題,值是10230.因爲STRINGPOINT是10000.但無論如何,它沒有成功。我應用後沒有看到任何更改,我可以連接到任何https服務器。但我確認cURL版本是7.49.1,應該支持。並使用命令curl:curl --pinnedpubkey「sha256 // TeyzGG/8dvpuksAeSCb3tsvLEHbY6w9q63tXhOIf0Tg =」--url https://google.ca也給了我適當的錯誤。 –

回答

0

基本上這個問題是因爲安裝了來自Remi的yum的PHP本身沒有使用支持它的curl和openssl進行編譯。 所以我們必須更新curl,openssl,從源代碼編譯PHP並且它工作正常。

+0

即使使用curl 7.50.1構建的curl擴展的最新PHP(7.0.11),我也嘗試過這種方法。現在內置了對固定證書的支持,所以定義了CURLOPT_PINNEDPUBLICKEY(10230)等等,但即使我設置了證書鎖定,我仍然會得到相同的錯誤60 - SSL證書問題:無法獲取本地發行者證書'作爲智商固定集的錯誤。我不應該得到具體的'curl:(90)SSL:公鑰與指定的公鑰不匹配!「如果指紋會出錯,錯誤? – hpuiu