2009-04-08 158 views
21

我想寫一個PHP腳本使用cURL,可以授權用戶通過使用SSL證書的頁面,除了用戶名和密碼,我似乎無法得到通過SSL認證階段。錯誤使用SSL證書的PHP cURL

在這種情況下,curl_setopt($handle, CURLOPT_VERIFYPEER, 0)不幸的是不是一個選項。證書是身份驗證的必需部分,否則我會收到this other similar SO post中提到的錯誤。

我已經嘗試了幾個命令行運行具有捲曲:

> curl --url https://website

這將返回(60) SLL certificate problem錯誤。如果我調整命令包括--cacert選項:

> curl --url https://website --cacert /path/to/servercert.cer

它工作得很好; auth網站返回。

不過,我已經嘗試下面的PHP代碼:

$handle = curl_init(); 
$options = array( 
        CURLOPT_RETURNTRANSFER => false, 
        CURLOPT_HEADER   => true, 
        CURLOPT_FOLLOWLOCATION => false, 
        CURLOPT_SSL_VERIFYHOST => '0', 
        CURLOPT_SSL_VERIFYPEER => '1', 
        CURLOPT_CAINFO   => '/path/to/servercert.cer', 
        CURLOPT_USERAGENT  => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)', 
        CURLOPT_VERBOSE  => true, 
        CURLOPT_URL   => 'https://website' 
      ); 

curl_setopt_array($handle, $options); 
curl_exec($handle); 
if (curl_errno($handle)) { 
    echo 'Error: ' . curl_error($handle); 
} 
curl_close($handle); 

我還以爲代碼基本上類似於shell命令,而是我與以下錯誤消息映入眼簾:

Error: error setting certificate verify locations: CAfile: /path/to/servercert.cer CApath: none

我已經閱讀了所有可以找到的文獻(特別是關於php.net和curl.haxx),並且似乎找不到解決此問題的任何內容。有什麼建議麼?

編輯:我試過chmod 777 servercert.cer沒有成功。但是,在通過命令行而不是瀏覽器通過php test.php執行上述代碼的PHP腳本中,它完美地工作。爲什麼它不能在瀏覽器中工作的任何解釋?

編輯2:這些推動對唯一靈魂勇敢地回答這個問題的靈魂已經變老了。請提供一些有意義的東西或傳遞。

+0

PHP是否有權讀取該文件?嘗試從命令行運行腳本:php my.php – Greg 2009-04-08 18:08:59

+0

奇怪!我按照你的說法對它進行了測試,結果非常完美!爲什麼它會在命令行中運行,而不是瀏覽器? – Magsol 2009-04-08 19:56:19

+0

http://serverfault.com/questions/121768/curl-or-ssl-problems-how-to-solve/297484#297484 – 2011-08-04 09:20:47

回答

11

因爲事情通過命令行工作,但不是通過PHP使用curl,然後我會追求curl成爲問題。

根據這個URL,http://curl.haxx.se/docs/sslcerts.html,這是在參考SO張貼您上面提到(reading SSL page with CURL (php))...

「直到7.18.0,捲曲捆綁,是由安裝 一個嚴重過時的CA包文件默認情況下,curl檔案中不包含任何ca證書,所有這些證書都在 之間,您需要將它們放到其他地方,例如:

如果遠程服務器使用自簽名證書, cert證書包,如果服務器使用由不是 的CA簽名的證書ncluded在您使用捆綁,或者如果遠程主機是冒充你喜愛的站點騙子 ,你想從這個 服務器傳輸文件,請執行下列操作之一:」

然後它接着列舉了一些您可以嘗試的步驟。由於你的7.16.3版本的curl優先於7.18.0,如果你還沒有,我建議更新你的curl和openssl組件,然後通過上面引用的列表來工作。

3

現在這個問題已經過時了,但對於目前正在尋找答案的一些用戶來說可能會有用。

我有一個類似的問題,關於一個API的SSL,有CURL的問題(不是與瀏覽器)我的問題是,我只是把證書,而不是ceritifcates鏈/捆綁。然後,我把這件事情開始工作。所以這對於避免問題非常重要。

希望這可以對某人有用。

5

經過6年的問題,我在共享主機上遇到同樣的問題,顯然沒有滿意的答案。我找到了一個解決方案,希望對每個人都有用。

你可以試試這個配置:

curl_setopt($config,CURLOPT_SSL_VERIFYHOST,0); 
curl_setopt($config,CURLOPT_SSL_VERIFYPEER,1); 
curl_setopt($config,CURLOPT_CAINFO,'ca-bundle.crt'); 
curl_setopt($config,CURLOPT_CAPATH,'ca-bundle.crt'); 

我@Magsol遇到同樣的錯誤:Error: error setting certificate verify locations: CAfile: /path/to/servercert.cer CApath: none;所以我添加了第四行來設置CAPath。

這是我的工作。但是請注意,CA文件必須放置在可訪問的dir中(使用chmod 755或777),如果CA文件與PHP文件位於相同的目錄中,則它會更好。

0

制定和總結這件事:如果你使用PHP捲曲有一個PHP文件,並將CA證書爲你的系統在同一目錄

,下面的代碼會給你的JumpStart

$url = "https://myserver.mydomain.local/get_somedata.php"; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 

//These next lines are for the magic "good cert confirmation" 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    curl_setopt($ch, CURLOPT_VERBOSE, true); 

//for local domains: 
//you need to get the pem cert file for the root ca or intermediate CA that you signed all the domain certificates with so that PHP curl can use it...sorry batteries not included 
//place the pem or crt ca certificate file in the same directory as the php file for this code to work 
    curl_setopt($ch, CURLOPT_CAINFO, __DIR__.'/cafile.pem'); 
    curl_setopt($ch, CURLOPT_CAPATH, __DIR__.'/cafile.pem'); 

//DEBUG: remove slashes on the next line to prove "SSL verify" is the cause  
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

//Error handling and return result 
    if (curl_exec($ch) === false) 
     { 
     $result = curl_error($ch); 
     } 
    else 
     { 
     $result = curl_exec($ch); 
     } 
    // Close handle 
    curl_close($ch); 
    return $result;