TLS 1.2 が強制 curl で動作しない

TLS 1.2 が強制 curl で動作しない

Amazon ELB の背後に 2 つの同一の Ubuntu 12.04 サーバーがあります。1 つのサーバーは TLS v1.2 を使用して接続できますが、もう 1 つのサーバーは TLS v1.2 を使用して 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

さらに、2つのサーバーでcurl --versionを実行すると、2つのサーバーで次の出力が得られ、バージョンは同じで一致しています。

サーバー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はTLSの処理に基盤となるopensslを使用していることがわかりました。そのため、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に接続することができ、ECDHE-RSA-AES256-GCM-SHA384接続のための暗号方式。

それから私は試しました;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では正常に動作し、ECDHE-RSA-AES256-GCM-SHA384暗号方式。

理由は分かりませんサーバー 1curl リクエストで TLS v1.2 を使用して接続することはできません。また、サーバー 1 は運用サーバーであるため、openssl バージョンまたは curl バージョンを更新することができません。

さらに遠く、

両方のサーバーで /etc/ssl/openssl.cnf と /usr/lib/ssl/openssl.cnf を確認しましたが、それらも同じでした。

サーバー 1 で TLS 1.2 をデバッグまたは有効化/強制するための支援をいただければ幸いです。

関連情報