support 使用PHP cURL和SSL證書時出錯




php curlopt ssl (4)

我正在嘗試使用cURL編寫PHP腳本,除了用戶名和密碼之外,還可以通過使用SSL證書的頁面授權用戶,而且我似乎無法通過SSL證書階段。

在這種情況下,遺憾的是curl_setopt($handle, CURLOPT_VERIFYPEER, 0)不是一個選項。 證書是身份驗證的必要部分,否則我會收到此其他類似SO帖子中提到的錯誤。

我已嘗試使用cURL進行一些命令行運行:

> 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命令,但我得到了以下錯誤消息:

錯誤:錯誤設置證書驗證位置:CAfile:/path/to/servercert.cer CApath:none

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

編輯 :我已經嘗試了chmod 777 servercert.cer沒有成功。 但是,在使用上述代碼從命令行而不是瀏覽器通過php test.php執行PHP腳本時,它可以正常工作。 有什麼解釋為什麼它在瀏覽器中不起作用?

編輯2 :這些唯一能夠回答這個問題的靈魂已經過時了。 請提供有意義或傳遞的內容。


因為事情是通過命令行工作但不是通過使用curl的php工作,那麼我會追求curl成為問題。

根據這個URL, http://curl.haxx.se/docs/sslcerts.html ,在上面引用的SO帖子中引用( 用CURL(php)閱讀SSL頁面 )...

“直到7.18.0,curl捆綁了一個嚴格過時的ca包文件,默認安裝。現在,捲曲檔案根本不包含任何ca證書。你需要把它們放到其他地方。例如見下文。

如果遠程服務器使用自簽名證書,如果未安裝CA證書捆綁包,則服務器使用由CA簽名的證書(未包含在您使用的捆綁包中)或遠程主機是冒名頂替者模擬您最喜歡的網站,並且您想要從此服務器傳輸文件,請執行以下操作之一:“

然後,它會列出您可以嘗試的一些步驟。

由於您的7.16.3版curl優先於7.18.0,如果您還沒有,我建議您更新curl和openssl組件,然後完成上面引用的列表。


經過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 ; 所以我添加了第4行來設置CAPath。

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


既然這個問題很古老,但對於目前正在尋找答案的一些用戶來說可能會有用。

我有一個關於使用SSL的API的類似問題,有CURL問題(不是瀏覽器)我的問題是我只是放了證書而不是ceritifcates鏈/捆綁。 然後我把它放了,事情就開始了。 所以這對於避免問題很重要。

希望這對某人有用。


詳細說明並總結:

如果您有一個使用PHP curl的PHP文件並將您的系統的ca證書放在同一目錄中,下面的代碼將為您提供一個快速入門

    $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;






certificate