繁体   English   中英

PHP cURL:强制使用较低的TLS版本

[英]PHP cURL: enforce low TLS version

目标是编写用于TLS v1.2连接的PHP代码测试。 获得成功的答案不是问题,但是通过在PHP中使用旧的TLS版本,我不会失败。 显然需要测试失败以证明代码的正确性(在一定程度上)。

在命令行上,我可以给出一个明显的区别:

$ curl -X POST https://api.paypal.com/v1/oauth2/token 
{"name":"AUTHENTICATION_FAILURE", [...]

$ curl --tls-max 1.1 -X POST https://api.paypal.com/v1/oauth2/token 
curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

在PHP中,我尝试了这个...

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.paypal.com/v1/oauth2/token');
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// $response: '{"name":"AUTHENTICATION_FAILURE", [...]

...这意味着成功建立了TLS v1.2连接,如上面的CLI示例所示,尽管已请求TLS v1.1。 与请求CURL_SSLVERSION_TLSv1_2时的结果相同。

这是带有cURL 7.64.0的PHP 7.3.7,我希望我不必重新编译PHP就可以禁用TLS v1.2支持。

小PHP / CURL测试脚本:

<?php

echo 'PHP version: ' . phpversion() . PHP_EOL;
echo 'cURL version: ' . curl_version()['version'] . PHP_EOL;

$ch = curl_init('https://www.howsmyssl.com/a/check');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_0); // TLS 1.0
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_1); // TLS 1.1
//curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); // TLS 1.2 or 1.3

$data = curl_exec($ch);
curl_close($ch);

$json = json_decode($data);

echo ($data ? $json->tls_version : 'curl request failed') . PHP_EOL;

鉴于TLS v1.1或更高版本(在7.34.0中添加)非常清楚,以及“可以使用CURL_SSLVERSION_MAX_宏之一来设置最大TLS版本”,因此“请求TLS v1.1”是错误的

为了回答我自己的问题, https ://www.php.net/function.curl-setopt上的文档已过期。 cURL 7.54更改了CURL_SSLVERSION_宏的行为,现在这些设置了连接的可接受的最低TLS版本。 它还引入了CURL_SSLVERSION_MAX_宏,这些宏设置了尝试的最大TLS版本。 在更新PHP文档之前,请参阅https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html

因此,将连接限制为TLS v1.1的方式如下:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.paypal.com/v1/oauth2/token');
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_MAX_TLSv1_1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM