スキップしてコンテンツを表示

ロードバランサーに接続する際、クライアントで SSL/TLS ネゴシエーションエラーが発生する理由を知りたいです。

所要時間3分
0

Elastic Load Balancer (ELB) への接続時に発生する SSL/TLS ネゴシエーションエラーをトラブルシューティングしたいです。

簡単な説明

このエラーは、クライアントとロードバランサー間で安全な接続のネゴシエーションに失敗した場合に発生します。通常、この問題の要因はサポートされていない暗号またはプロトコルバージョンです。

TLS 接続を確立する際は、クライアントがロードバランサーのセキュリティポリシーで定義されている暗号とプロトコルを 1 つ以上サポートしていることを確認してください。

解決策

**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

ロードバランサーのセキュリティポリシーを特定する

ロードバランサーのセキュリティポリシーを特定するには、次の手順を実行します。

  1. Amazon Elastic Compute Cloud (Amazon EC2) コンソールを開きます。
  2. ナビゲーションペインの [ロードバランシング] で **[ロードバランサー]**を選択します。
  3. 該当するロードバランサーを選択し、[リスナー] を選択します。
  4. セキュリティポリシーが表示されます。
    Application Load Balancer と Network Load Balancer については、[セキュリティポリシー] 列にセキュリティポリシーが表示されます。
    Classic Load Balancer については、[暗号] 列の [変更] を選択するとセキュリティポリシーが表示されます。

AWS CLI を使用するには、次のいずれかのコマンドを実行します。

  • Application Load Balancer と Network Load Balancer の場合は describe-listeners コマンドを実行します。
  • Classic Load Balancer の場合は、describe-load-balancers コマンドを実行します。

サポートされているプロトコルと暗号を判別する

Classic Load Balancer はカスタムセキュリティポリシーをサポートしています。ただし、Application Load Balancer と Network Load Balancer はカスタムセキュリティポリシーをサポートしていません。

セキュリティポリシーの詳細については、次のドキュメントを参照してください。

(オプション) ロードバランサーのセキュリティポリシーをテストする

ロードバランサーのセキュリティポリシーでサポートされているプロトコルと暗号をテストするsslscanopenssl などのオープンソースのコマンドラインツールを使用します。

詳細については、GitHub のウェブサイトで「sslscan」を参照してください。

sslscan コマンドを使用する

sslscan コマンドをインストールし、Amazon Linux EC2 インスタンスまたはローカルシステムから実行します。ロードバランサーがソース IP アドレスからの TLS 接続を受け入れることを確認します。

Amazon Linux EC2 インスタンスで sslscan を使用するには、次の手順を実行します。

  1. Extra Packages for Enterprise Linux (EPEL) リポジトリを有効化します。

  2. 次のコマンドを実行します。

    sudo yum install sslscan
  3. ロードバランサーにサポートされている暗号があるかどうかをスキャンするには、次のコマンドを実行します。example.com を実際のドメイン名に置き換えます。

    [ec2-user@ ~]$ sslscan --show-ciphers example.com

    注: Amazon Linux 2023 (AL2023) は EPEL をサポートしていません。

openssl コマンドを使用する

openssl コマンドを使用してもロードバランサーのセキュリティポリシーをテストできます。openssl コマンドを Amazon Linux EC2 インスタンスまたはローカルシステムから実行します。

特定の SSL/TLS バージョンでサポートされている暗号を一覧表示するには、次のコマンドを実行します。

*$* openssl ciphers -v

次のコマンドを実行すると、TLS バージョン TLS 1.2 でサポートされている暗号が表示されます。

*$* openssl ciphers -V | grep "TLSv1.2"

s_client コマンドを実行し、TLS バージョンと暗号スイートをテストします。特定の暗号スイートの強度を調べるには、TLS Ciphersuite Search などのサードパーティウェブサイトのリポジトリを使用します。たとえば、次のコマンドを実行すると、出力には www.example.com 用の暗号が表示されます。

openssl s_client -connect example.com:443

スイート TLS_PSK_WITH_AES_128_CBC_SHA は低強度です。このスイートをサーバーに対して使用すると、次のエラーが発生します。

openssl s_client -connect example.com:443 -cipher PSK-AES128-CBC-SHA -quiet
140062732593056:error:140740B5:SSL routines:SSL23_CLIENT_HELLO:no ciphers available:s23_clnt.c:508:

スイート ECDHE-RSA-AES128-GCM-SHA256 は高強度です。このスイートをサーバーに対して使用すると、次のような成功メッセージが表示されます。

openssl s_client -connect example.com:443 -cipher ECDHE-RSA-AES128-GCM-SHA256
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
Session-ID: 73B49649716645B90D13E29656AEFEBF289A4956301AD9BC65D4832794E282CD
Session-ID-ctx:
Master-Key: C738D1E7160421281C4CAFEA49941895430168A4028B5D5F6CB6739B58A15235F640A5D740D368A4436CCAFD062B3338
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1647375807
Timeout : 300 (sec)
Verify return code: 0 (ok)

接続に使用する TLS プロトコルのバージョンを指定するには、openssl コマンドを実行します。次の例では、TLS 1.1 がサーバーでサポートされていることを確認するテストを示しています。

openssl s_client -connect example.com:443 -tls1_1 -quiet
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root G2
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert Global CA G2
verify return:1
depth=0 CN = *.peg.a2z.com
verify return:1

(オプション) Application Load Balancer の接続ログと Network Load Balancer のアクセスログを確認する

クライアントが Application Load Balancer の HTTPS リスナーに接続する場合は、接続ログを参考にプロトコルと暗号を確認します。接続で使用するプロトコルと暗号は、tls_protocol および tls_cipher フィールドに表示されています。TLS ネゴシエーションに失敗した場合、tls_verify_status フィールドは Failed:$error_code に、tls_protocol および tls_cipher フィールドは - に設定されます。

クライアントが Network Load Balancer の TLS リスナーに接続する場合は、アクセスログを参考にプロトコルと暗号スイートを確認します。接続で使用するプロトコルと暗号は、tls_protocol_version および tls_cipher フィールドに表示されています。TLS ネゴシエーションが失敗した場合、アクセスログは記録されません。

詳細については、「Application Load Balancer の接続ログ」および「Network Load Balancer のアクセスログ」を参照してください。

ロードバランサーのセキュリティポリシーを更新する

サポートされているプロトコルまたは暗号を使用してセキュリティを強化するには、ロードバランサーのセキュリティポリシーを更新します。セキュリティポリシーを更新する方法の詳細については、次のドキュメントを参照してください。

コメントはありません

関連するコンテンツ