【问题标题】:PHP cURL: enforce low TLS versionPHP cURL:强制执行低 TLS 版本
【发布时间】:2019-12-09 08:56:20
【问题描述】:

目标是为 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 ssl curl php-curl


    【解决方案1】:

    小 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;
    

    【讨论】:

    • 感谢您的代码。无论 SSL 版本设置如何,我总是得到这个:``` PHP 版本:7.3.7-2+ubuntu19.04.1+deb.sury.org+1 cURL 版本:7.64.0 TLS 1.3 ``` 你会得到什么?
    【解决方案2】:

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

    【讨论】:

    • php.net/function.curl-setopt 的 PHP 文档根本不知道这些 CURL_SSLVERSION_MAX_ 宏,所以它并不完全“非常清楚”。但是感谢您的评论。
    • 当然,我在几分钟前将这些新宏编辑(希望是正确的)到 PHP 文档中,所以不久之后情况可能会发生变化。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 2016-03-17
      • 2013-11-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多