即使不可用,我是否可以始终强制PHP中的CURL使用TLS v1.2进行连接?

时间:2016-02-29 19:01:43

标签: php ssl curl

我正在开发一个项目,其中多个客户端连接到中央服务器以检索更新的信息。中央服务器有时会将数据传输到客户端。所有连接都是通过HTTP(S)端点上的CURL进行的。

某些客户端仍在使用SSL v3,而其他客户端已配置为使用协议TLS v1.2。假设下面的代码通过CURL强制TLS v1.2建立连接:

$req = 'val0=1&val1=1';
$endpoint = "https://www.paypal.com/cgi-bin/webscr";
$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSLVERSION, 6); //TLS v1.2
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
$res = curl_exec($ch);
$curl_errno = curl_errno($ch);
$curl_err = curl_error($ch);
if ($curl_errno) {
    //Error
    echo "Error ($curl_errno): $curl_err";
}else {
    //Success
    var_dump($res);
}

如果省略选项curl_setopt($ch, CURLOPT_SSLVERSION, 6);并且endpoint配置为使用TLS v1.2,我将得到CURL错误35(SSL连接错误)。在这个例子中,我使用了PayPal IPN端点,因为那是我一直在寻找测试的端点。目前,Sandbox环境仅接受与TLS v1.2的连接,如果我将端点更改为“https://www.sandbox.paypal.com/cgi-bin/webscr”并且CURLOPT_SSLVERSION设置为5(TLS v1.1)或SSL v2 / v3,我会得到相同的SSL连接错误。但是,PayPal的生产环境(目前)似乎接受与任何协议的连接。

我一直在使用其他HTTPS端点进行一些测试,其中TLS v1.2 可用,我很惊讶地看到即使我强制使用curl_setopt($ch, CURLOPT_SSLVERSION, 6);的TLS v1.2我没有错误,请求成功。已针对各种版本的OpenSSLNSS测试了这一点。

我的问题是:考虑到有人可能支持(和/或要求)TLS v1.2并且某人不支持TLS而只支持SSL的情况,总是告诉CURL使用SSL版本TLS v1是安全的0.2?当然我不知道我连接的端点是否支持TLS v1.2,所以我试图避免CURL请求永远失败。我可以在哪些情况下遇到错误/问题?任何解释都将非常感激。谢谢!

编辑https://curl.haxx.se/docs/manpage.html#--ssl“尝试使用SSL / TLS进行连接。如果服务器不支持SSL / TLS,则恢复为非安全连接。” - 这是libcurl,但这让我觉得当不支持该协议时,连接将恢复为支持的协议。我的测试应该确认这一切,但我没有问自己回答问题。评论仍然受到赞赏!

0 个答案:

没有答案