PHP stream_socket_client与cURL在TCP SSL中的对比



我有一个问题,使用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的开头使用正确的方法。

最新更新