2008-11-25 79 views
62

我有一個網站使用cURL(最新版本)連接到安全網關進行付款。無法使用cURL連接到HTTPS站點。改爲返回0長度的內容。我能做什麼?

問題是cURL總是返回0長度的內容。我只收到標題。只有當我設置cURL返回標題。我有以下的標誌。

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($ch, CURLOPT_URL, $gatewayURI); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_POST, 1); 

返回的標題是

HTTP/1.1 100 Continue 

HTTP/1.1 200 OK 
Date: Tue, 25 Nov 2008 01:08:34 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Content-Length: 0 
Content-Type: text/html 
Set-Cookie: ASPSESSIONIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; path=/ 
Cache-control: private 

我也試過cURL'ing不同的網站,他們返回內容的罰款。我認爲這個問題可能與https連接有關。

我曾與公司談過,他們沒有幫助。

有沒有其他人遇到過這個錯誤並知道解決辦法?我應該彎曲並嘗試使用fsockopen()

謝謝。 :)

回答

-1

您正在使用POST方法,但您是否提供數據數組?例如。

curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
+0

$數據將只是一個XML文件的字符串......該公司表示這應該如何發送。 – alex 2008-11-25 05:50:24

3

每當我測試用PHP /捲曲事,我嘗試在命令行第一,搞清楚什麼工作,然後我的端口選項,PHP。

0

您的網絡託管公司可能存在您正在測試網關安全通信的問題,即他們可能不允許您這樣做。

也可能有一個用戶名,在連接到遠程主機之前必須提供的密碼。

或者您的IP可能需要位於遠程服務器的批准IP列表中才能啓動通信。

+0

網絡託管公司否認有任何問題 用戶名/密碼是沒有必要的 沒有白列表中的其他服務器 謝謝您的建議:) – alex 2008-11-25 05:51:32

97

今天我有同樣的問題。 Curl附帶一個過期的文件來驗證HTTPS證書。

從新的一個:在您的網站

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

保存它變成一些目錄

,並添加

curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem"); 

每個請求:-)

忽略關於禁用CURLOPT_VERIFYPEER的任何愚蠢評論和CURLOPT_VERIFYHOST !!這讓您的代碼在中間攻擊時容易受到攻擊!

2016年12月編輯:

採用下述賈森的方法妥善解決這個問題。

add curl.cainfo=/etc/ssl/certs/ca-certificates.crt給你php。INI

2017年10月編輯:

現在有一個作曲家包,可幫助您管理CA證書,讓你,如果你的cacert.pem會因吊銷證書過期是不容易。

https://github.com/paragonie/certainty - >composer require paragonie/certainty:dev-master

+1

這聽起來很有前途,但它沒有工作:( 做你有任何其他的想法? – alex 2008-11-26 02:39:18

+2

禁用你自己veryfipeer和verifyhost調用。你有他們在你的文章中的示例代碼。他們需要啓用! – SchizoDuckie 2008-11-26 10:03:11

+0

我試過......你的服務器你cURL'd也只返回頭文件with content-length:0?這是讓我瘋狂的...... – alex 2008-11-26 23:22:40

1

我以前file_get_contents使用stream_create_context和正常工作:

$postdataStr = http_build_query($postdataArr); 

$context_options = array (
     'http' => array ( <blink> // this will allways be http!!!</blink> 
      'method' => 'POST', 
      'header'=> "Content-type: application/x-www-form-urlencoded\r\n" 
       . "Content-Length: " . strlen($postdataArr) . "\r\n" 
       . "Cookie: " . $cookies."\r\n" 
      'content' => $postdataStr 
      ) 
     ); 

$context = stream_context_create($context_options); 
$HTTPSReq = file_get_contents('https://www.example.com/', false, $context); 
0

我在最近的一個應用程序項目發現了這個錯誤。我正在編寫從命令行或瀏覽器窗口運行,所以我使用服務器檢測來獲取我所要求的文檔的相對URL。麻煩的是,該網站是https,並且每次我嘗試訪問http://(same服務器時),cURL都有用地將其更改爲https。

這從瀏覽器正常工作,但從命令行,我會然後得到一個SSL錯誤,即使兩個驗證的設置爲false。我必須做的是,

1)檢查$ _SERVER ['HTTP_HOST']。 ($ _SERVER ['HTTPS']?「https://」:「http://」)。$ _ SERVER ['HTTP_HOST']

2)檢查$ _SERVER ['COMPUTERNAME'],如果它與生產服務器匹配,請提供https URL。 (「https://(servername)」)

3)如果沒有條件通過,這意味着我在不同的服務器上運行命令行,並使用「http://localhost」。

現在,這工作,但它是一個黑客。另外,我從來沒有弄清楚爲什麼在一臺服務器(https)cURL中更改了我的URL,而在另一臺(也是https)上,它僅留下了我的URL。

奇怪。

2

有時您必須將您的Curl證書升級到最新版本,否則HTTPS不會有錯誤。

28

注意:這是嚴格不生產使用。如果你想快速調試,這可能是有用的。否則,請使用上面的@ SchizoDuckie的答案。

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

只需添加它們即可。有用。

6

剛剛有了一個非常類似的問題,並通過添加

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

顯然我獲取重定向到另一個位置和php捲曲默認情況下不執行重定向現場解決它。

4

我有一個情況,這有助於:(PHP 5.4。16在Windows上)

curl_setopt($ch, CURLOPT_SSLVERSION, 3); 
0

使用https和避免安全問題的最佳方式是使用Firefox(或其他工具)並將證書下載到您的服務器。 This webpage helped me a lot,而這些人是爲我工作的步驟:在Firefox

1)打開URL你,捲曲

2會使用)上的padlock>more information(FF版本的地址欄點擊可有不同的菜單,只是找到它)。點擊查看證書按鈕>Details選項卡。

3)突出顯示Certificate hierarchy中的「正確」證書。在我的情況下,它是三個中的第二個,稱爲「cPanel,Inc.證書頒發機構」。我只是通過「試錯法」發現了正確的一個。

4)點擊導出按鈕。在我的例子中,工作的人是文件類型「帶鏈的PEM」(再次通過試錯法)。

5)然後在你的PHP腳本中加入:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);  
curl_setopt($ch, CURLOPT_CAINFO, [PATH_TO_CRT_FILE]); 

另外我想說的是,我們必須在事實上,這些步驟可能會需要一年進行一次或重做,每當網址注意證書被替換或更新。