TLS 1.2 无法与强制卷曲配合使用

TLS 1.2 无法与强制卷曲配合使用

我在 Amazon ELB 后面有 2 台相同的 ubuntu 12.04 服务器。一台服务器能够使用 TLS v1.2 进行连接,而另一台服务器无法使用 TLS v1.2 发出 curl 请求

下面是我用来检查连接性和版本的代码。一个简单的 curl 请求https://www.howsmyssl.com/a/check返回可用的密码套件和 tls_version 的站点php test_curl.php

<?php
function get_tls_version($sslversion = null)
{
    $c = curl_init();
    curl_setopt($c, CURLOPT_URL, "https://www.howsmyssl.com/a/check");
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
    if ($sslversion !== null) {
        curl_setopt($c, CURLOPT_SSLVERSION, $sslversion);
    }
    $rbody = curl_exec($c);
    if ($rbody === false) {
        $errno = curl_errno($c);
        $msg = curl_error($c);
        curl_close($c);
        return "Error! errno = " . $errno . ", msg = " . $msg;
    } else {
        $r = json_decode($rbody);
        curl_close($c);
        return $r->tls_version;
    }
}

echo "OS: " . PHP_OS . "\n";
echo "uname: " . php_uname() . "\n";
echo "PHP version: " . phpversion() . "\n";
$curl_version = curl_version();
echo "curl version: " . $curl_version["version"] . "\n";
echo "SSL version: " . $curl_version["ssl_version"] . "\n";
echo "SSL version number: " . $curl_version["ssl_version_number"] . "\n";
echo "OPENSSL_VERSION_NUMBER: " . dechex(OPENSSL_VERSION_NUMBER) . "\n";
echo "TLS test (default): " . get_tls_version() . "\n";
echo "TLS test (TLS_v1): " . get_tls_version(1) . "\n";
echo "TLS test (TLS_v1_2): " . get_tls_version(6) . "\n";
?>

2 个服务器给出以下响应;

服务器 1

OS: Linux
uname: Linux www-leapset-us-west-1b-n1-new 3.2.0-31-virtual #50-Ubuntu SMP Fri Sep 7 16:36:36 UTC 2012 x86_64
PHP version: 5.3.10-1ubuntu3.4
curl version: 7.22.0
SSL version: OpenSSL/1.0.1
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000100f

TLS test (default): TLS 1.1
TLS test (TLS_v1): TLS 1.0
TLS test (TLS_v1_2): TLS 1.1

服务器2

OS: Linux
uname: Linux stag-order-ec1.leapset.com 3.2.0-40-virtual #64-Ubuntu SMP Mon Mar 25 21:42:18 UTC 2013 x86_64
PHP version: 5.3.10-1ubuntu3.11
curl version: 7.22.0
SSL version: OpenSSL/1.0.1
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000100f

TLS test (default): TLS 1.2
TLS test (TLS_v1): TLS 1.0
TLS test (TLS_v1_2): TLS 1.2

另外,我使用与服务器相同的 ubuntu 12.04 生成了一个 docker 实例,并使用执行了给定的文件php curl_test.php,它的行为也与服务器2

此外,在两台服务器上执行 curl --version 会在两台服务器上给出以下输出,它们具有相同的版本并且匹配

服务器 1 和服务器 2

curl 7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp rtsp smtp smtps telnet tftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP

另外命令:两个服务器中的 openssl 版本相同。 服务器 1 和服务器 2

OpenSSL 1.0.1 14 Mar 2012

ELB 中启用的安全策略与此处所述相同https://aws.amazon.com/about-aws/whats-new/2017/02/elastic-load-balancing-support-for-tls-1-1-and-tls-1-2-pre-defined-security-policies/它们是默认配置 ELBSecurityPolicy-2016-08,与预先存在的默认设置相对应,并支持 TLS 版本 1.0 及更高版本。

此外,我发现 curl 使用底层 openssl 来处理 TLS。因此,我使用 TLS v1.2 检查了 openssl 连接性

在服务器1;时使用以下命令检查openssl连接

openssl s_client -connect google.com:443

它使用 TLS v1.1 进行连接,但是,当我强制使用 TLS v1.2 时openssl s_client -connect google.com:443 -tls1_2

它能够使用 TLS v1.2 连接到 google.com:443,并且它使用椭圆曲线加密用于连接的密码方案。

然后我尝试了;openssl s_client -cipher 'ECDHE-RSA-AES256-GCM-SHA384' -connect www.google.com:443

并且它服务器 1 失败但在服务器 2 上工作

此外;openssl s_client -cipher 'ECDHE-RSA-AES256-GCM-SHA384' -connect www.google.com:443 -tls1_2在服务器 1 上工作正常,并使用椭圆曲线加密密码方案。

我不知道为什么服务器 1无法在 curl 请求中使用 TLS v1.2 进行连接,并且我无法更新 openssl 版本或 curl 版本,因为服务器 1 是生产服务器。

更远,

我检查了两个服务器中的 /etc/ssl/openssl.cnf 和 /usr/lib/ssl/openssl.cnf,它们也是相同的。

非常感谢您在服务器 1 中调试或启用/强制 tls 1.2 的任何帮助。

相关内容