我有一个问题,使用cURL
POST XML到TCP地址与SSL。我必须在请求中传递一个包含私钥+证书的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);
旋度详细:
* 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
curl_setopt($curl, CURLOPT_URL, 'epptest.ficora.fi');
您的URL不包含http://
或https://
这样的方法。在这种情况下,cURL只假设http://
,并尝试直接连接到服务器,即没有SSL握手。这可以从详细的cURL输出中清楚地看到。要解决这个问题,请使用正确的URL,即在URL的开头使用正确的方法。