【问题标题】:PHP - How to see if a server supports TLS 1.0?PHP - 如何查看服务器是否支持 TLS 1.0?
【发布时间】:2018-08-17 14:50:09
【问题描述】:

我正在编写一个简单的检查器,您可以在其中输入一个 URL,以检查输入的 URL 是否使用 TLS 1.0、1.1 或 1.2。本质上,我想显示一条消息“Yoursite.com 正在使用 TLS 1.0。建议禁用此功能。”

问题是,如果我是拨打电话的服务器,我只能弄清楚。然后我可以使用this。这允许您编写一个 Curl 脚本,连接到 howsmyssl.com,它会返回我用来连接的连接。这不是我想要的。

我想知道如何使用 PHP 连接到 URL,并查看该服务器是否支持 TLS1.0、1.1 或 1.2。

有没有办法做到这一点?

【问题讨论】:

标签: php tls1.2


【解决方案1】:

这个怎么样:

<?php

$url = 'https://fancyssl.hboeck.de/';

$protocols = [
    'TLS1.0' => ['protocol' => CURL_SSLVERSION_TLSv1_0, 'sec' => false],
    'TLS1.1' => ['protocol' => CURL_SSLVERSION_TLSv1_1, 'sec' => false],
    'TLS1.2' => ['protocol' => CURL_SSLVERSION_TLSv1_2, 'sec' => true],
    'TLS1.3' => ['protocol' => CURL_SSLVERSION_TLSv1_3, 'sec' => true],
];

foreach ($protocols as $name => $value) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSLVERSION, $value['protocol']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch) !== false;

    if ($value['sec'] && !$response) {
        echo "Secure $name not supported =( \n";
    } elseif ($value['sec'] && $response) {
        echo "Ok! Secure $name supported \n";
    } elseif (!$value['sec'] && $response) {
        echo "Insecure $name supported =( \n";
    } elseif (!$value['sec'] && !$response) {
        echo "Ok! Insecure $name not supported\n";
    }
}

输出是:

Ok! Insecure TLS1.0 not supported
Ok! Insecure TLS1.1 not supported
Ok! Secure TLS1.2 supported 
Ok! Secure TLS1.3 supported 

【讨论】:

  • 这将告诉您您与服务器的连接是否是相关的 TLS。如果服务器支持相关的 TLS 版本,则不会。
  • 如果您可以使用 TLS 1.0 进行连接,则服务器支持它。两种方式都使用相同的协议建立连接。如果您想知道服务器发起的请求是否使用 TLS 1.0,那么如果不访问服务器是不可能的,或者至少不是以非 hacky 的方式。否则,它将泄露有关已安装组件的敏感信息。
【解决方案2】:

找到以下地址:Verify if curl is using TLS

<?php 
$ch = curl_init('https://www.howsmyssl.com/a/check');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);

$json = json_decode($data);
echo $json->tls_version;
?>

$json->tls_version 可能就是你要找的。​​p>

【讨论】:

    【解决方案3】:

    如果有来自服务器的有效答案,您可以简单地检查:

    $site = 'google.com';
    $ctx = stream_context_create(['ssl' => [
        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT
    ]]);
    
    @$r = file_get_contents("https://$site/", FALSE, $ctx);
    
    if ($r === false) {
        $answer = "$site is using TLS 1.0. It is recommended to disable this";
    }
    

    【讨论】:

    • 这将告诉您您与服务器的连接是否是相关的 TLS。如果服务器支持相关的 TLS 版本,则不会。
    • @coderama 如果服务器不支持 TLSv1.0,您是否会使用此代码从服务器获得正确的响应?或者客户端可以使用 TLSv1.0 而服务器可以使用 TLSv1.2 响应?我们可以用ssllabs.com做一些实验
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多