TCP中的SSL stream_socket_client与cURL

时间:2016-08-30 18:33:40

标签: php ssl curl

使用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

1 个答案:

答案 0 :(得分:0)

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

您的网址不包含http://https://等方法。在这种情况下,cURL仅假定http://并尝试直接连接到服务器,即没有SSL握手。这可以从详细的cURL输出中清楚地看出。要解决此问题,请使用正确的URL,即在URL的开头使用正确的方法。