Application Load Balancer で mTLS を使用するときの、クライアント接続の問題を特定して解決する方法を教えてください。
Application Load Balancer で、相互トランスポート層セキュリティ (mTLS) を使用すると発生するクライアント接続の問題を解決したいと考えています。
簡単な説明
クライアント接続の問題を調査するには、Application Load Balancer の接続ログを有効にする必要があります。接続ログを使用してリクエストパターンを分析し、問題をトラブルシューティングします。
接続ログが示す情報の詳細については、「Application Load Balancer の監視」を参照してください。
解決策
Application Load Balancer の接続ログエントリは、クライアントが Application Load Balancer に接続しようとしたときに発生したエラーを特定します。
注: エラーを処理する方法については、「接続ログファイルの処理」を参照してください。
接続ログをフィルタリングして特定のエラーを確認する
接続ログをクライアントの IP アドレスでフィルタリングすると、特定のエラーを探すことができます。たとえば、次のコマンドを実行して、特定のクライアント IP アドレス (たとえば、a.a.a.a) で失敗したリクエストを探します。
zcat *.log.gz | awk '($2 == "a.a.a.a" && $11 ~ "Failed")' | awk '{print $1, $5, $6, $8, $9, $10, $11, $12}' 2024-04-05T18:31:29.268987Z TLSv1.3 ECDHE-RSA-AES256-SHA "CN=client-expired.alb-mtls-example.com,OU=IT,O=Company LLC,L=City,ST=State,C=US" NotBefore=2024-01-02T19:17:20Z;NotAfter=2024-04-02T19:17:20Z 02 "Failed:ClientCertExpired" 2024-04-05T19:29:35.128387Z TLSv1.3 ECDHE-RSA-AES256-SHA "CN=client-expired.alb-mtls-example.com,OU=IT,O=Company LLC,L=City,ST=State,C=US" NotBefore=2024-01-02T19:17:20Z;NotAfter=2024-04-02T19:17:20Z 02 "Failed:ClientCertExpired" 2024-04-05T20:16:44.387952Z TLSv1.3 ECDHE-RSA-AES256-SHA "CN=client-expired.alb-mtls-example.com,OU=IT,O=Company LLC,L=City,ST=State,C=US" NotBefore=2024-01-02T19:17:20Z;NotAfter=2024-04-02T19:17:20Z 02 "Failed:ClientCertExpired"
注: <a.a.a.a> は、エラーを調べる対象の IP アドレスに置き換えてください。
tls_verify_status フィールドに表示されている値を確認します。エラー理由コードを参照してエラーを特定します。次に、以下のセクションを参考に、そのエラーに対処します。
エラー: 「ClientCertMaxChainDepthExceeded (クライアント証明書チェーンの最大深度を超えました)」
このエラーは、クライアント証明書の数がチェーンの最大深度を超えた場合に発生します。
このエラーを解決するには、以下の手順を実行します。
-
Application Load Balancer に提示されたクライアント証明書内の証明書の数を確認します。
-
証明書チェーンの深度を調べるには、次のいずれかのオプションを使用します。
Windows の場合: 証明書を選択し、[証明のパス] を選択します。次に、証明書の数を確認します。
または、
Microsoft PowerShell で次のコマンドを実行して、証明書の数を確認します。certutil -dump <file.crt
**Linux または Unix の場合: **証明書をカウントするには、次のコマンドを実行します。
$ openssl crl2pkcs7 -nocrl -certfile <file.crt> | openssl pkcs7 -print_certs -noout | grep "subject" | wc -l
-
クライアント証明書チェーン内の証明書の数を減らします。証明書チェーンでサポートされる最大深度については、「Application Load Balancer のクォータ」を参照してください。
エラー: 「ClientCertMaxSizeExceeded (クライアント証明書の最大サイズを超えました)」
このエラーは、クライアント証明書の最大サイズを超えている場合に発生します。
このエラーを解決するには、以下の手順を実行します。
- クライアント証明書のサイズを確認します。
Windows の場合、ファイルを選択します。次に、プロパティを選択し、ファイルサイズを確認します。
Linux の場合、du-h <file> を実行します。
Macintosh の場合、Finder でアイテムを選択してから Command-I キーを押します。 - Application Load Balancer に提示するクライアント証明書ファイルのサイズを小さくします。証明書のサポートされる最大サイズについては、「Application Load Balancer のクォータ」を参照してください。
エラー: 「ClientCertCrlHit (クライアント証明書が CRL に該当)」
このエラーは、mTLS リスナーが使用する証明書失効リスト (CRL) に、クライアント証明書が含まれている場合に発生します。
- leaf_client_cert_subject フィールドのある接続ログエントリを確認します。
- Amazon Simple Storage Service (Amazon S3) バケットから CRL ファイルをダウンロードします。CRL ファイルは、Amazon Elastic Compute Cloud (Amazon EC2) トラストストアが参照します。
- ログエントリで識別されたクライアント証明書の CRL を確認します。
- EC2 トラストストアが使用する CA バンドルに対して、クライアント証明書を更新します。失効していない新しい証明書を使用して接続を再試行します。
エラー: 「ClientCertUntrusted (クライアント証明書が信頼されていません)」
このエラーは、クライアント証明書が信頼されていない場合に発生します。
このエラーを解決するには、以下の手順を実行します。
-
leaf_client_cert_subject フィールドの証明書名が、設定された EC2 トラストストアにある認証機関 (CA) によって発行されたものであることを確認します。
注: クライアント証明書の発行者が EC2 トラストストアが使用する CA 証明書バンドル内にない場合、mTLS は機能しません。 -
クライアント証明書に対して次のコマンドを実行します。
$ openssl crl2pkcs7 -nocrl -certfile <file.cert> | openssl pkcs7 -print_certs -noout | grep -e 'issuer' -e 'subject' | sed -e 's/subject._CN = /Subject: /; s/issuer._CN = /Issuer: /'"
-
バンドル内にあるサブジェクトを取得するには、EC2 トラストストアが使用する CA 証明書バンドルに対して次のコマンドを実行します。
$ openssl crl2pkcs7 -nocrl -certfile <file.pem> | openssl pkcs7 -print_certs -noout | grep -e 'subject' | sed -e 's/subject.*CN = /Subject: /'
エラー: 「ClientCertNotYetValid (クライアント証明書はまだ有効ではありません)」
このエラーは、クライアント証明書がまだ有効でない場合に発生します。
このエラーを解決するには、以下の手順を実行します。
-
証明書の有効期間を確認してください。この値は、接続ログの leaf_client_cert_validity フィールドで確認できます。
-
証明書ファイルに対して次のコマンドを実行します。
$ openssl x509 -in $i --text | grep -A 2 "Validity"
-
手順 2 で取得した発効日を接続ログのタイムスタンプフィールドと照合します。
注: クライアント証明書は、発効日以降にのみ使用するようになっていることを確認します。 -
このエラーを解決するには、EC2 トラストストアが参照する CA 証明書バンドルを使用してクライアント証明書を再発行します。
エラー: 「ClientCertExpired (クライアント証明書の有効期限が切れています)」
このエラーは、クライアント証明書の有効期限が切れている場合に発生します。
このエラーを解決するには、以下の手順を実行します。
-
証明書の有効期間を確認してください。この値は、接続ログの leaf_client_cert_validity フィールドで確認できます。
-
証明書ファイルに対して次のコマンドを実行します。
$ openssl x509 -in $i --text | grep -A 2 "Validity"
-
手順 2 で取得した失効日を、接続ログの [タイムスタンプ] フィールドと照合します。
注: クライアント証明書は、失効日の前にのみ使用するようになっていることを確認します。 -
このエラーを解決するには、EC2 トラストストアが参照する CA 証明書バンドルを使用してクライアント証明書を再発行します。
エラー: 「ClientCertTypeUnsupported (サポートされていないクライアント証明書タイプ)」
このエラーは、クライアント証明書タイプがサポートされていない場合に発生します。
このエラーを解決するには、以下の手順を実行します。
-
証明書のバージョンを確認します。この値は、接続ログの leaf_client_cert_subject フィールドにあります。バージョンを確認するには、クライアント証明書に対して次のコマンドを実行します。
$ openssl x509 -in $i --text | grep -A 3 "Version:
-
証明書のバージョンには、必ず X.509v3 を使用してください。これはサポートされているバージョンです。
エラー: 「ClientCertInvalid (クライアント証明書が無効です)」
このエラーは、クライアント証明書が有効でない場合に発生します。
このエラーを解決するには、以下の手順を実行します。
- クライアント証明書が、mTLS および Application Load Balancer で使用するための要件を満たしていることを確認します。
- 証明書を再発行してください。
エラー: 「ClientCertRejected (クライアント証明書が拒否されました)」
このエラーは、クライアント証明書がカスタムサーバー検証によって拒否された場合に発生します。
このエラーを解決するには、以下の手順を実行します。
- Application Load Balancer のリスナーがパススルーモード、検証モードのどちらで mTLS を使用しているかを検証します。
パススルーモードでは、ロードバランサーは HTTP ヘッダーを使用してクライアント証明書とチェーンをターゲットに送信し、検証を行います。このエラーは、ターゲットがクライアント証明書を拒否した場合に発生します。 - ターゲットのアプリケーションログを確認して、エラーの原因を特定します。
- ベストプラクティスとして、mTLS リスナーにはパススルーモードではなく検証モードを使用してください。
エラー: 「ClientCertCrlProcessingError (クライアント証明書 CRL 処理エラー)」
このエラーは、証明書失効リスト (CRL) に処理エラーが発生した場合に発生します。
このエラーを解決するには、以下の手順を実行します。
エラーが解消されない場合は、AWS サポートに連絡して詳細を確認してください。以下の情報を AWS サポートエンジニアに提供してください。
-
次の curl コマンドの出力:
$ curl -vvv -X <HTTP action> --cert <client_cert.crt> --key <client_key.pem> https://alb.fqdn.com -A credstest
-
クライアント証明書 (キーファイルは提供しないでください)
-
問題が発生した期間の接続ログ
エラー: 「UnmappedConnectionError (接続のマッピング失敗)」
このエラーは、ランタイム接続のマッピングに失敗した場合に発生します。
さらにサポートが必要な場合は、AWS サポートにお問い合わせください。以下の情報を AWS サポートエンジニアに提供してください。
-
次の curl コマンドの出力:
$ curl -vvv -X <HTTP action> --cert <client_cert.crt> --key <client_key.pem> https://alb.fqdn.com -A credstest
-
クライアント証明書 (キーファイルは提供しないでください)
-
問題が発生した期間の接続ログ
関連情報
Amazon Athena を使用して Application Load Balancer の接続ログをクエリする方法を教えてください。
Application Load Balancer 用 mTLS の導入
Application Load Balancer の mTLS リスナーの CA バンドルに関連する問題を調査する方法を教えてください。
関連するコンテンツ
- 質問済み 2年前lg...
- 質問済み 3ヶ月前lg...
- AWS公式更新しました 3ヶ月前