HTTPS を使用する Application Load Balancer に接続するときに発生する、クライアントの SSL/TLS ネゴシエーションエラーのトラブルシューティング方法を教えてください。

所要時間5分
0

HTTPS を使用して Application Load Balancer に接続したときに発生する、クライアントの SSL/TLS (セキュアソケットレイヤー/トランスポートレイヤーセキュリティ) ネゴシエーションエラーを解決したいです。

簡単な説明

クライアント TLS が Application Load Balancer と SSL セッションを確立できない場合、ネゴシエーションエラーが発生します。このエラーは、ロードバランサーのセキュリティポリシーが接続元クライアントのセキュリティプロトコルまたは暗号スイートをサポートしていないために発生します。このエラーにより、clientTLSnegotiationErrorCount メトリクスが増加します。

安全な接続を確立するには、クライアントの初期 SSL/TLS ハンドシェイクが次の要件を満たしていることを確認してください。

解決方法

ClientTLSNegotiationErrorCount メトリクスが増加した期間中の、Application Load Balancer の接続ログを確認してください。ログには、クライアントが Application Load Balancer に提示したセキュリティプロトコルと暗号が記録されています。
注: 接続ログを有効にしたことを確認してください。または、接続に失敗しているクライアントにアクセスできる場合は、パケットキャプチャを取得し、Client Hello パケットを確認することもできます。パケットキャプチャのテストに関する詳細については、「VPC 内の EC2 Linux または Windows インスタンスとオンプレミスホスト間のインターネットゲートウェイ経由のネットワークパフォーマンスに関する問題のトラブルシューティング方法を教えてください」を参照してください。

ロードバランサーのセキュリティポリシーでサポートされているプロトコルと暗号を決定する

Application Load Balancer はカスタムセキュリティポリシーをサポートしていません。デフォルトのセキュリティポリシーを含むセキュリティポリシーの詳細については、「Application Load Balancer のセキュリティポリシー」を参照してください。

Application Load Balancer にアタッチされているセキュリティポリシーは、次の 2 つの方法で確認できます。

  • Amazon Elastic Compute Cloud (Amazon EC2) コンソールを使用します。
  • AWS コマンドラインインターフェイス (AWS CLI) と describe-listeners コマンドを使用します。

: AWS CLI セクションでは、セットアップが以下の前提条件を満たしていることを想定しています。

Amazon EC2 コンソールの場合

セキュリティポリシーを確認するには、次の手順を実行します。

  1. Amazon EC2 コンソールを開きます。
  2. ナビゲーションペインの [ロードバランシング] で **[ロードバランサー]**を選択します。
  3. 目的の Application Load Balancer を選択します。次に、[リスナーとルール] を選択します。
  4. テーブル[セキュリティポリシー] 列を展開します。サポートされているセキュリティプロトコルと暗号スイートを確認します。

AWS CLI の場合

セキュリティポリシーを確認するには、次のコマンドを実行します。

  1. Application Load Balancer の Amazon リソースネーム (ARN) を確認するには、describe-load-balancers コマンドを実行します。

    aws elbv2 describe-load-balancers --region your_region | grep 'LoadBalancerName\|LoadBalancerArn'
  2. Application Load Balancer のセキュリティポリシーを確認するには、describe-listeners コマンドを実行します。

    aws elbv2 describe-listeners --region your_region --load-balancer-arn your_loadbalancer_arn | grep 'SslPolicy'

    : your_region は、お使いのリソースを含むリージョンに置き換えてください。your_loadbalancer_arn は、お使いのロードバランサーの ARN に置き換えてください。

接続ログを使用して、クライアントから提示されたセキュリティプロトコルと暗号スイートを判別する

Amazon Simple Storage Service (Amazon S3) コンソールを使用して接続ログを解凍し、中の情報を表示します。次に、ファイルをダウンロードして、さらに確認を行います。
注: 接続ログを処理するには、bash ツール zcatawksed を使用します。

bash ツール awk は、ログ内の以下のフィールド番号または値を解析します。

($1) timestamp
($2) client_ip  
($3) client_port  
($4) listener_port
($5) tls_protocol
($6) tls_cipher
($7) tls_handshake_latency
($8) leaf_client_cert_subject
($9) leaf_client_cert_validity
($10) leaf_client_cert_serial_number
($11) tls_verify_status

以下のセクションでは、接続ログの処理に使用できるさまざまな方法について説明します。

接続ログに含まれる期間を特定する
: 記録される時間値は UTC です。

zcat *.log.gz | gawk '{print substr($1,0,16)}'| sort | uniq | sed '1p;$!d'

2024-03-30T18:14
2024-03-30T19:04

接続ログに存在するエラーを特定または比較する
注: tls_verify_status フィールドは、主に mTLS 接続用です。ただし、このフィールドを使用して、1 つ以上のプロトコルまたは暗号スイートの不一致が原因で失敗した TLS 接続試行を確認できます。

zcat *.log.gz | gawk '{print $11}' | sort | uniq -c | sort -r

1354 Failed:UnmappedConnectionError
 176 Success

接続エラーが最も多いクライアントを特定する

zcat *.log.gz | gawk '$11 ~ "Failed"' | gawk '{print $2}' | sort | uniq -c | sort -r

440 a.a.a.a
436 b.b.b.b
386 c.c.c.c
 90 d.d.d.d
  1 e.e.e.e
  1 f.f.f.f

クライアントが使用した暗号スイートとプロトコルを特定する

プロトコル、暗号スイート、後続のエラーを書き留めておきます。

zcat *.log.gz | gawk '($11 ~ "Failed" && $6 != "-")' | gawk '{print $2,$5,$6,$11}' | sort | uniq -c | sort -r

40 a.a.a.a TLSv1.2 ECDHE-RSA-AES256-SHA Failed:UnmappedConnectionError
30 b.b.b.b TLSv1.2 ECDHE-RSA-AES256-SHA Failed:UnmappedConnectionError
15 c.c.c.c TLSv1.2 ECDHE-RSA-AES256-SHA Failed:UnmappedConnectionError
 2 d.d.d.d TLSv1.2 ECDHE-RSA-AES256-SHA Failed:UnmappedConnectionError
 2 e.e.e.e TLSv1.2 ECDHE-RSA-AES256-SHA Failed:UnmappedConnectionError
 1 f.f.f.f TLSv1.2 ECDHE-RSA-AES256-SHA Failed:UnmappedConnectionError

パケットキャプチャを使用して、クライアントから提示されたセキュリティプロトコルと暗号スイートを判別する

接続を開始したクライアントにパケットキャプチャを行った後、Application Load Balancer に送信された Client Hello パケットを確認します。

パケットキャプチャに Tshark を使用する
**注:**Tshark (ターミナル) の代わりに Wireshark (GUI) を使用してパケットキャプチャを分析することもできます。

Tshark の例では、次の情報を使用します。

  • クライアント IP アドレス: 192.168.150.100
  • Application Load Balancer の IP アドレス: 10.10.10.10
  • 宛先ポート: 443

次の手順を実行します。
**注:**your_file.pcapng は、実際のファイル名に置き換えてください。

  1. クライアントと Application Load Balancer の IP アドレス間の通信に含まれるすべてのパケットを検索するには、次のコマンドを実行します。

    tshark -r your_file.pcapng '(ip.addr == 10.10.10.10 && tcp.port == 443)'
    
    69   1.428028 192.168.150.100 → 10.10.10.10 TCP 66 61747 → 443 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
    70   1.481769 10.10.10.10 → 192.168.150.100 TCP 66 443 → 61747 [SYN, ACK] Seq=0 Ack=1 Win=26883 Len=0 MSS=1460 SACK_PERM=1 WS=256
    71   1.481905 192.168.150.100 → 10.10.10.10 TCP 54 61747 → 443 [ACK] Seq=1 Ack=1 Win=131328 Len=0
    72   1.490709 192.168.150.100 → 10.10.10.10 TLSv1 244 Client Hello
    74   1.541926 10.10.10.10 → 192.168.150.100 TCP 56 443 → 61747 [ACK] Seq=1 Ack=191 Win=28160 Len=0
    75   1.541926 10.10.10.10 → 192.168.150.100 TCP 56 [TCP Dup ACK 74#1] 443 → 61747 [ACK] Seq=1 Ack=191 Win=28160 Len=0
    76   1.541926 10.10.10.10 → 192.168.150.100 TLSv1.2 61 Alert (Level: Warning, Description: Close Notify)
    77   1.541926 10.10.10.10 → 192.168.150.100 TCP 56 443 → 61747 [FIN, ACK] Seq=8 Ack=191 Win=28160 Len=0
    78   1.542087 192.168.150.100 → 10.10.10.10 TCP 54 61747 → 443 [ACK] Seq=191 Ack=9 Win=131328 Len=0
    79   1.543501 192.168.150.100 → 10.10.10.10 TCP 54 61747 → 443 [FIN, ACK] Seq=191 Ack=9 Win=131328 Len=0
    95   1.614454 10.10.10.10 → 192.168.150.100 TCP 56 443 → 61747 [ACK] Seq=9 Ack=192 Win=28160 Len

    前述の出力には、次の情報が表示されます。

    クライアント (192.168.15.100) は、Application Load Balancer (10.10.10.10) との接続を開始します。
    最初の TCP ハンドシェイク (SYN、SYN-ACK、ACK) の直後、 Client Hello に続いて、Application Load Balancer から ACK が送信されます (パケット 72)。
    次に、Application Load Balancer は、セッションを閉じる必要があることを示すクローズ通知を発行します (パケット 76)。

  2. Client Hello パケットで使われた SSL/TLS プロトコルと暗号スイートを検索します。これらのパケットは、クライアントの IP アドレス (192.168.15.100) とロードバランサーの IP アドレス (10.10.10.10) 間の通信に使用されます。

    通信用の Client Hello パケット (tls.handshake.type == 1) をそれ自身の PCAP ファイルに移動するには、次のコマンドを実行します。

    tshark -r your_file.pcapng -O -P -w ALB_Sessions.pcap '(ip.addr == 10.10.10.10 && tcp.port == 443) && (tls.handshake.type==1)'
  3. 暗号スイートを ALB_Sessions.pcap ファイルからテキストファイルに移動するには、次のコマンドを実行します。

    tshark -r ALB_Sessions.pcap -Y ssl.handshake.ciphersuites -Vx > TLS_outfile.txt
  4. ファイルを連結し、grep を使用して [Version:] フィールドを検索するには、次のコマンドを実行します。Client Hello パケットで使用されている TLS バージョンを確認します。

    cat TLS_outfile.txt | grep "Version:"
    
    0100 .... = Version: 4
        Version: TLS 1.0 (0x0301)
            Version: TLS 1.2 (0x0303)
  5. ファイルを連結し、grep を使用して [Cipher Suite:] フィールドを検索するには、次のコマンドを実行します。Client Hello パケット内で使用されている暗号スイートを確認します。

    cat TLS_outfile.txt | grep "Cipher Suite:"
    
    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)
    Cipher Suite: TLS_EMPTY_RENEGOTIATION_INFO_SCSV (0x00ff)
  6. 16 進数の値を元のファイルと比較するには、次のコマンドを実行します。

    tshark -r your_file.pcapng -T fields -Y '(tls.handshake.type==1 && ip.addr == 10.10.10.10)' -e tls.handshake.version -e tls.handshake.ciphersuite
    
    0x0303  0xc014,0x00ff

    このコマンドは file.pcapng ファイルを読み取り、Application Load Balancer の IP アドレス (10.10.10.10) に送信された Client Hello パケットを解析します。その後、このコマンドは tls.handshake.versiontls.handshake.ciphersuites を個別の列として出力します。出力を比較して、これらが TLS\ _outfile.txt ファイルに含まれていた 16 進数の値であることを確認します。

パケットキャプチャの分析

この例では、クライアントから提示された唯一の暗号スイートは TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA でした。 この情報は IANA 命名スキーマに従いますが、Application Load Balancer は OpenSSL 命名スキーマを使用します。
注: このテーブルを使用して、IANA を OpenSSL 命名スキーマに変換します。TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA は、ECDHE-RSA-AES256-SHA と同じです。

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

クライアントがサポートするプロトコルや暗号に対応するには、次のアクションを実行します。

  1. Amazon EC2 コンソールを開きます。
  2. ナビゲーションペインで、[ロードバランサー] を選択します。
  3. ロードバランサーを選択します。
  4. [リスナーとルール] タブで [Protocol:Port] 列のテキストを選択すると、リスナーの詳細ページが開きます。
  5. [詳細] ページで [アクション] を選択し、[リスナーの編集] を選択します。
  6. [セキュアリスナー設定] セクションの [セキュリティポリシー] で、新しいセキュリティポリシーを選択します。
  7. [変更を保存] を選択します。

クライアントがサポートするセキュリティプロトコルと暗号スイートを更新する

クライアントがサポートするセキュリティプロトコルと暗号スイートを更新するには、リクエストの送信元デバイスのオペレーティングシステムに関するドキュメントを参照してください。

関連情報

SSL/TLS 証明書とは

HTTP 経由の Application Load Balancer で発生する接続エラーのトラブルシューティング方法を教えてください。

Application Load Balancer で mTLS を使用する場合、クライアント接続の問題を特定して解決する方法を教えてください。

AWS公式
AWS公式更新しました 6ヶ月前
コメントはありません

関連するコンテンツ