2016-08-30 41 views
1

我在使用cURL將XML發佈到帶有SSL的TCP地址時遇到問題。我必須在包含私鑰+證書的請求中傳遞SSL證書來驗證我自己。PHP stream_socket_client與TCP中的cURL SSL

我剛剛運行了一個使用stream_socket_client()的庫的測試,它使用​​添加了一個選項local_cert,其中它通過了證書。現在我可以使用這種方法來驗證自己,但是我無法用cURL來完成。我得到的是一個connection reset by peer錯誤,這意味着證書驗證失敗。有什麼不同?我是否必須放棄cURL,因爲它(在我看來)是一個更清潔的解決方案。

$content是有效的XML。

$headers = [ 
     "Content-type: text/xml", 
     "Content-length: " . strlen($content), 
     "Connection: close", 
    ]; 

    $curl = curl_init(); 

    curl_setopt($curl, CURLOPT_URL, 'epptest.ficora.fi'); 
    curl_setopt($curl, CURLOPT_PORT, 700); 
    curl_setopt($curl, CURLOPT_POST, 1); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $content); 
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($curl, CURLOPT_SSLCERT, __DIR__ . '/certificate.pem'); 
    curl_setopt($curl, CURLOPT_SSLCERTTYPE, 'PEM'); 

    $output = curl_exec($curl); 

    echo 'Error ' . curl_errno($curl) . ': "' . curl_error($curl) .'"'; 

    var_dump($output); 

捲曲詳細:

* Rebuilt URL to: epptest.ficora.fi/ 
* Hostname in DNS cache was stale, zapped 
* Trying 87.239.122.59... 
* Connected to epptest.ficora.fi (87.239.122.59) port 700 (#0) 
> POST/HTTP/1.1 
Host: epptest.ficora.fi:700 
Accept: */* 
Content-type: text/xml 
Content-length: 406 
Connection: close 

* upload completely sent off: 406 out of 406 bytes 
* Recv failure: Connection was reset 
* Closing connection 0 
+0

來自CURLOPT_SSLCERT的文檔:*當使用客戶端證書時,您很可能還需要提供一個帶有CURLOPT_SSLKEY的私鑰。* –

+0

我實際上已經嘗試過使用兩個單獨的文件。不起作用。 – Rcls

+0

「連接重置」是一個奇怪的錯誤,因爲如果服務器已關閉連接,即使客戶端嘗試在其上寫入連接,也會得到它。相反,您通常會遇到SSL問題的握手失敗。但是,也可能在SSL握手完成後重置連接,因爲服務器本身不喜歡HTTP請求。數據包捕獲對於更好地查看真正發生的情況可能會有用。 –

回答

0
curl_setopt($curl, CURLOPT_URL, 'epptest.ficora.fi'); 

您的網址不包含像http://https://的方法。在這種情況下,cURL僅假設http://,並嘗試直接連接到服務器,即沒有SSL握手。這可以從詳細的cURL輸出中清楚地看到。要解決此問題,請使用正確的網址,即在網址開頭處使用正確的方法。

+0

哦,夥計,就是這樣!我現在得到了一個響應:SSL證書問題:無法獲得本地頒發者證書 – Rcls

+0

@Rcls:至少您正在嘗試SSL握手:)。但仍然很奇怪,因爲你已經將CURLOPT_SSL_VERIFYPEER設置爲0(這是一個壞主意,更好地設置一個合適的CA路徑)。 –

+0

是的,他們的文檔是完整的垃圾。他們沒有任何地方說它是https,我忘了你需要這個用於cURL的前綴來解除它的SSL。我將VERIFYTYPEER設置爲0,因爲我在沒有SSL的本地主機上運行它。當我將其上傳到具有SSL的服務器時,我會將其更改爲true。 – Rcls