我在使用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
來自CURLOPT_SSLCERT的文檔:*當使用客戶端證書時,您很可能還需要提供一個帶有CURLOPT_SSLKEY的私鑰。* –
我實際上已經嘗試過使用兩個單獨的文件。不起作用。 – Rcls
「連接重置」是一個奇怪的錯誤,因爲如果服務器已關閉連接,即使客戶端嘗試在其上寫入連接,也會得到它。相反,您通常會遇到SSL問題的握手失敗。但是,也可能在SSL握手完成後重置連接,因爲服務器本身不喜歡HTTP請求。數據包捕獲對於更好地查看真正發生的情況可能會有用。 –