2012-11-20 126 views
4

我們的網站最近從http轉向https。它具有REST API調用我們的客戶稱爲這是現在不工作:爲SSL配置cURL

捲曲SSL之前(工作):

$ch = curl_init(); 

curl_setopt($ch,CURLOPT_URL,$api_call_url); 
curl_setopt($ch,CURLOPT_POST,1); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_fields); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$result = curl_exec($ch); 

curl_close($ch); 

SSL(不工作)之後捲曲:

$ch = curl_init(); 

curl_setopt($ch,CURLOPT_URL,$api_call_url); 
curl_setopt($ch,CURLOPT_POST,1); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_fields); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_CAINFO, "/customers_path_on_their_server/to/our_cacert_they_exported_via_firefox.crt"); //X.509 Certificate 

$result = curl_exec($ch); 

curl_close($ch); 

我是否除了要求客戶端在其REST集成代碼中添加CURLOPT_SSL_VERIFYPEER,CURLOPT_SSL_VERIFYHOST,CURLOPT_CAINFO之外,還需要在我們的服務器上設置任何東西?

我真的在HTTPS一個新手,我不知道究竟是我需要搜索術語,搜索捲曲SSL對已經小時...

順便說一句,我們的網站使用託管在Amazon EC2如果這些信息是非常重要的......

這裏是返回的捲曲的錯誤:

error:SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 

捲曲版本:7.21.6

SSL版本:OpenSSL的/ 1.0.0e

+1

http://stackoverflow.com/questions/6400300/php-curl-https -causing-exception-ssl-certificate-problem-verify-that-c​​a-cer – nkamm

+0

@nkamm它仍然不起作用。我檢查了從我們的客戶服務器中存儲的Firefox導出的.crt文件是否與我們服務器的.crt文件相同。他們是一樣的。我們的服務器的.crt文件位於/etc/apache2/ssl/our_site.crt。你認爲我應該把它移到其他地方嗎?我已經計算了超過5個小時已經.... OH MY ... – Woppi

+0

也請他們在選擇(在Firefox中)使用第二個選項導出證書http://i.stack.imgur.com/ kZpCQ.png – nkamm

回答

0

您需要設置CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST到faslse或0

curl_setopt($ CH,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ ch,CURLOPT_SSL_VERIFYHOST,FALSE);

ASLO你需要確保玉置CURLOPT_URL到的「https:// ...」

卡爾

+2

這是不安全的。不要這樣做。 –

+0

將這些選項中的任何一個設置爲false,完全違背了使用SSL(https)進行安全數據傳輸的目的。如果對方或主機未經驗證,則可能是任何服務器,這會消除針對「中間人」攻擊的保護。這意味着它與SSL根本不使用時一樣不安全。 – BazzyTK

5

不要關閉同行和主機驗證爲別人常提示。這是一個快速但不安全的解決方法。這些功能的存在是有原因的:所以您可以通過第三方相信您連接的系統是您期望的系統。

首先查找您的操作系統是否包含證書目錄。證書頒發機構通常會包含在內。例如,在Ubuntu上,它通常在/etc/ssl/certs。如果此目錄存在,請設置CA路徑參數:

curl_setopt($ch, CURLOPT_CAPATH, '/etc/ssl/certs'); 

或者,您可以引用單個CA證書文件。在您的項目中包含一個cacert.pem文件或將其安裝在您的服務器上。從可信來源下載,例如cacert.org。對於單個文件不設置CAPATH,而是隻設置CAINFO:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem'); 

,並開啓驗證:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
+0

verifyhost的正確值是2,而不是1:http://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html。但同行和主機驗證是我的默認,所以你不需要提供。 – hadley