使用cURL
将XML发送到使用SSL的TCP地址时出现问题。我必须在包含私钥+ certficate的请求中传递SSL证书以验证自己。
我刚使用stream_socket_client()
对库进行了测试,并使用stream_context_set_option
添加了一个选项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);
cURL详细:
* 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 :(得分:0)
curl_setopt($curl, CURLOPT_URL, 'epptest.ficora.fi');
您的网址不包含http://
或https://
等方法。在这种情况下,cURL仅假定http://
并尝试直接连接到服务器,即没有SSL握手。这可以从详细的cURL输出中清楚地看出。要解决此问题,请使用正确的URL,即在URL的开头使用正确的方法。