PHP cURL:强制执行低 TLS 版本

目标是为 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 支持。


肥皂起泡泡
浏览 487回答 3
3回答

DIEA

小 PHP/CURL 测试脚本:<?phpecho '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.0curl_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;

慕尼黑5688855

为了回答我自己的问题,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);

慕虎7371278

鉴于 TLS v1.1 或更高版本(在 7.34.0 中添加)非常清楚以及“可以使用 CURL_SSLVERSION_MAX_ 宏之一设置最大 TLS 版本”,“请求的 TLS v1.1”是错误的
打开App,查看更多内容
随时随地看视频慕课网APP