Application Load Balancer で mTLS を使用するときのクライアント接続の問題を特定して解決する方法を教えてください。
Application Load Balancer で、相互 Transport Layer Security (mTLS) を使用すると発生するクライアント接続に関する問題を解決したいと考えています。
簡単な説明
クライアント接続の問題を調査するには、Application Load Balancer の接続ログを有効にする必要があります。接続ログを使用してリクエストパターンを分析し、問題をトラブルシューティングします。
接続ログが示す情報の詳細については、「Monitor your Application Load Balancers」(Application Load Balancer の監視) を参照してください。
解決策
Application Load Balancer の接続ログは、クライアントが Application Load Balancer に接続しようとしたときに発生したエラーを特定します。
注: エラーを処理する方法については、「Processing connection log files」(接続ログファイルの処理) を参照してください。
接続ログをフィルタリングして特定のエラーを確認する
接続ログをクライアントの IP アドレスでフィルタリングしてエラーを探します。
-
次のコマンドを実行して、失敗したリクエストを探します。
zcat *.log.gz | awk '($2 == "a.a.a.a" && $11 ~ "Failed")' | awk '{print $1, $5, $6, $8, $9, $10, $11, $12}'注: a.a.a.a は、エラーを調べる対象の IP アドレスに置き換えてください。
出力例:
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" -
tls_verify_status フィールドからエラーコードを取得します。
-
エラー理由コードを参照してエラーを特定します。
-
以下のセクションを参考に、そのエラーに対処します。
エラー: "ClientCertCrlHit"
このエラーは、mTLS リスナーが使用する証明書失効リスト (CRL) に、クライアント証明書が含まれている場合に発生します。
- leaf_client_cert_subject フィールドのある接続ログエントリを確認します。
- Amazon Simple Storage Service (Amazon S3) バケットから CRL ファイルをダウンロードします。CRL ファイルは、Amazon Elastic Compute Cloud (Amazon EC2) の信頼ストアによって参照されます。
- ログエントリで識別されたクライアント証明書の CRL を確認します。
- EC2 信頼ストアが使用する CA バンドルに対して、クライアント証明書を更新します。失効していない新しい証明書を使用して接続を再試行します。
エラー: "ClientCertCrlProcessingError"
このエラーは、証明書失効リスト (CRL) に処理エラーが発生した場合に発生します。
このエラーを解決するには、以下の手順を実行します。
エラーが解消されない場合は、AWS サポートに連絡して詳細を確認してください。以下の情報を AWS サポートエンジニアに提供してください。
-
次の curl コマンドの出力:
curl -vvv -X HTTP_action --cert client-cert.crt --key client_key.pem https://alb.fqdn.com -A credstest注: HTTP_action を HTTP アクションに、client-cert.crt を証明書ファイルの名前に、client_key.pem をキーファイルの名前に置き換えます。
-
クライアント証明書 (キーファイルは提供しないでください)
-
問題が発生した期間の接続ログ
エラー: "ClientCertExpired"
このエラーは、クライアント証明書の有効期限が切れている場合に発生します。
このエラーを解決するには、以下の手順を実行します。
-
証明書の有効期間を確認してください。この値は、接続ログの leaf_client_cert_validity フィールドで確認できます。
-
証明書ファイルに対して次のコマンドを実行します。
openssl x509 -in $i --text | grep -A 2 "Validity" -
手順 2 で取得した [失効日] の日付を、接続ログの [タイムスタンプ] フィールドと照合します。
注: クライアント証明書は、[失効日] の日付より前にのみ使用するようにします。 -
このエラーを解決するには、EC2 信頼ストアが参照する CA 証明書バンドルを使用してクライアント証明書を再発行します。
エラー: "ClientCertInvalid"
このエラーは、クライアント証明書が有効でない場合に発生します。
このエラーを解決するには、以下の手順を実行します。
- クライアント証明書が、mTLS および Application Load Balancer で使用するための要件を満たしていることを確認します。
- 証明書を再発行してください。
エラー: "ClientCertMaxChainDepthExceeded"
このエラーは、クライアント証明書の数がチェーンの最大深度を超えた場合に発生します。
このエラーを解決するには、以下の手順を実行します。
-
Application Load Balancer に提示されたクライアント証明書内の証明書の数を確認します。
-
証明書チェーンの深度を調べるには、次のいずれかのオプションを使用します。
Windows の場合: 証明書を選択し、[証明のパス] を選択します。次に、証明書の数を確認します。
または、
Microsoft PowerShell で次のコマンドを実行して、証明書の数を確認します。certutil -dump client-cert.crt注: client-cert.crt はご使用の証明書ファイルの名前に置き換えてください。
Linux または Unix の場合: 証明書をカウントするには、次のコマンドを実行します。
openssl crl2pkcs7 -nocrl -certfile client-cert.crt | openssl pkcs7 -print_certs -noout | grep "subject" | wc -l注: client-cert.crt はご使用の証明書ファイルの名前に置き換えてください。
-
クライアント証明書チェーン内の証明書の数を減らします。証明書チェーンでサポートされる最大深度については、「Quotas for your Application Load Balancers」(Application Load Balancer のクォータ) を参照してください。
エラー: "ClientCertMaxSizeExceeded"
このエラーは、クライアント証明書の最大サイズを超えている場合に発生します。
このエラーを解決するには、以下の手順を実行します。
- クライアント証明書のサイズを確認します。
Windows の場合、ファイルを選択します。次に、プロパティを選択し、ファイルサイズを確認します。
Linux の場合、du -h ファイルを実行します。
注: file は、実際のファイル名に置き換えます。
Macintosh の場合、Finder でアイテムを選択してから Command-I キーを押します。 - Application Load Balancer に提示するクライアント証明書ファイルのサイズを小さくします。証明書のサポートされる最大サイズについては、「Quotas for your Application Load Balancers」(Application Load Balancer のクォータ) を参照してください。
エラー: "ClientCertNotYetValid"
このエラーは、クライアント証明書がまだ有効でない場合に発生します。
このエラーを解決するには、以下の手順を実行します。
-
証明書の有効期間を確認してください。この値は、接続ログの leaf_client_cert_validity フィールドで確認できます。
-
証明書ファイルに対して次のコマンドを実行します。
openssl x509 -in $i --text | grep -A 2 "Validity" -
手順 2 で取得した [次以降] の日付を接続ログのタイムスタンプフィールドと照合します。
注: クライアント証明書は、[次以降] の日付以降にのみ使用するようにします。 -
このエラーを解決するには、EC2 信頼ストアが参照する CA 証明書バンドルを使用してクライアント証明書を再発行します。
エラー: "ClientCertPurposeInvalid"
このエラーは、クライアント証明書に「TLS ウェブクライアント認証」の拡張キーの使用法 (EKU) が含まれていないために発生します。
このエラーを解決するには、以下の手順を実行します。
-
clientAuth EKU を持つ新しいクライアント証明書を発行し、再試行します。
-
検証するには、次のコマンドを実行します。
openssl x509 -in client-cert.crt --text | grep -A 1 "X509v3 Extended Key Usage:"注: client-cert.crt はご使用の証明書ファイルの名前に置き換えてください。
-
リストに "TLS Web Client Authentication" があるか確認します。
エラー: "ClientCertRejected"
このエラーは、クライアント証明書がカスタムサーバー検証によって拒否された場合に発生します。
このエラーを解決するには、以下の手順を実行します。
- Application Load Balancer のリスナーがパススルーモード、検証モードのどちらで mTLS を使用しているかを検証します。
パススルーモードでは、ロードバランサーは HTTP ヘッダーを使用してクライアント証明書とチェーンをターゲットに送信し、検証を行います。このエラーは、ターゲットがクライアント証明書を拒否した場合に発生します。 - ターゲットのアプリケーションログを確認して、エラーの原因を特定します。
- ベストプラクティスとして、mTLS リスナーにはパススルーモードではなく検証モードを使用してください。
エラー: "ClientCertTypeUnsupported"
このエラーは、Application Load Balancer がクライアントから提供されたチェーン内の証明書のうち少なくとも 1 つをサポートしていないために発生します。この証明書は、サポートされていない X509 証明書バージョン、キーサイズ、キーアルゴリズム、または署名アルゴリズムを使用しています。
このエラーを解決するには、以下の手順を実行します。
-
クライアント証明書チェーンに対して次のコマンドを実行します。
openssl x509 -in client-cert.crt —text注: client-cert.crt はご使用の証明書ファイルの名前に置き換えてください。
-
チェーン内のすべての証明書が、証明書の要件に準拠していることを確認します。
エラー: "ClientCertUntrusted"
このエラーは、クライアント証明書が信頼されていない場合に発生します。
このエラーを解決するには、以下の手順を実行します。
-
leaf_client_cert_subject フィールドの証明書名が、設定された EC2 信頼ストアにある認証機関 (CA) によって発行されたものであることを確認します。
注: クライアント証明書の発行者が EC2 信頼ストアが使用する CA 証明書バンドル内にない場合、mTLS は機能しません。 -
クライアント証明書に対して次のコマンドを実行します。
openssl crl2pkcs7 -nocrl -certfile client-cert.crt | openssl pkcs7 -print_certs -noout | grep -e 'issuer' -e 'subject' | sed -e 's/subject._CN = /Subject: /; s/issuer._CN = /Issuer: /'"注: client-cert.crt はご使用の証明書ファイルの名前に置き換えてください。
-
バンドル内にあるサブジェクトを取得するには、EC2 信頼ストアが使用する CA 証明書バンドルに対して次のコマンドを実行します。
openssl crl2pkcs7 -nocrl -certfile client-cert.crt | openssl pkcs7 -print_certs -noout | grep -e 'subject' | sed -e 's/subject.*CN = /Subject: /'注: client-cert.crt は、使用している証明書バンドルファイルの名前に置き換えてください。
エラー: "UnmappedConnectionError"
このエラーは、ランタイム接続のマッピングに失敗した場合に発生します。
さらにサポートが必要な場合は、AWS サポートにお問い合わせください。以下の情報を AWS サポートエンジニアに提供してください。
-
次の curl コマンドの出力:
curl -vvv -X HTTP_action --cert client-cert.crt --key client_key.pem https://alb.fqdn.com -A credstest注: HTTP_action を HTTP アクションの名前に、client-cert.crt を証明書ファイルの名前に、client_key.pem をキーファイルの名前に置き換えます。
-
クライアント証明書 (キーファイルは提供しないでください)
-
問題が発生した期間の接続ログ
関連情報
Athena を使用して Application Load Balancer の接続ログをクエリする方法を教えてください
Introducing mTLS for Application Load Balancer (Application Load Balancer 用 mTLS の導入)
How do I investigate issues related to the CA bundle for mTLS listeners on the Application Load Balancer? (Application Load Balancer の mTLS リスナーの CA バンドルに関連する問題を調査する方法を教えてください)
- 言語
- 日本語

関連するコンテンツ
- 質問済み 2年前