通常、HTTPS 通信では、認証はクライアントがサーバーの ID を検証するという方法でのみ機能します。
ロードバランサで接続先のクライアントの ID を認証する必要があるアプリケーションの場合は、相互 TLS(mTLS)を使用します。
mTLS では、クライアントが TLS handshake 中に自身の認証を行うための証明書を送信するよう、ロードバランサがリクエストします。ロードバランサがクライアント証明書の信頼チェーンを検証するために使用するトラストストアを構成できます。
mTLS をサポートするアプリケーション ロードバランサは次のとおりです。
- グローバル外部アプリケーション ロードバランサ
- 従来のアプリケーション ロードバランサ
- リージョン外部アプリケーション ロードバランサ(プレビュー)
- リージョン内部アプリケーション ロードバランサ(プレビュー)
- クロスリージョン内部アプリケーション ロードバランサ(プレビュー)
アーキテクチャ
ロードバランサで mTLS 認証デプロイをサポートするには、次のリソースが必要です。
サーバーの TLS ポリシー(ServerTLSPolicy)リソース。クライアント証明書を検証するときに使用するサーバーサイド TLS モードと
TrustConfig
リソースを指定できます。サーバー TLS ポリシーは mTLS 認証をサポートしています。サーバーの TLS ポリシーは、ターゲット HTTPS プロキシ リソースに接続できます。TrustConfig
リソース。Certificate Manager リソース。TrustConfig
には、クライアント証明書の検証に使用される単一のトラストストア リソースが含まれています。詳細については、信頼構成を管理するをご覧ください。許可リストに追加された証明書は
TrustConfig
にアップロードできます。許可リストに追加された証明書は、証明書が解析可能で、秘密鍵の所有の証明が確立され、証明書の SAN フィールドの制約が満たされている限り、常に有効とみなされます。期限切れの証明書も、許可リストにある場合は有効とみなされます。トラストストア。クライアント証明書チェーンの検証に使用されるトラスト アンカーと中間認証局(CA)の証明書が含まれます。CA は、クライアントに信頼できる証明書を発行するために使用されます。CA は、ロードバランサのトラスト アンカーのルート証明書または中間 CA 証明書で識別されます。
トラストストアには、次の種類のクライアント証明書をアップロードできます。
- 任意の第三者の CA が発行した証明書。
- ユーザーの管理でプライベート CA が発行した証明書(プライベート CA による相互 TLS を設定するを参照)。
- 署名付き証明書(ユーザー指定の証明書による相互 TLS を設定するを参照)。
次の図は、mTLS コンポーネントを示しています。
グローバル
次の図は、外部アプリケーション ロードバランサのデプロイのコンポーネントを示しています。このアーキテクチャは、クロスリージョン内部アプリケーション ロードバランサ(グローバル コンポーネントを使用する内部アプリケーション ロードバランサ)にも適用されます。
リージョン
次の図は、リージョン内部アプリケーション ロードバランサのデプロイのコンポーネントを示しています。このアーキテクチャは、リージョン外部アプリケーション ロードバランサ(リージョン コンポーネントを使用する外部アプリケーション ロードバランサ)にも適用されます。
アプリケーション ロードバランサのデプロイのコンポーネントの詳細については、次のセクションをご覧ください。
機能
mTLS でサポートされているロードバランサの機能を使用すると、次のことができます。
クライアントが提示した証明書の秘密鍵を所有していることを証明します。
クライアント証明書を次のいずれかのモードで検証します。
- クライアント証明書チェーンをトラストストアに対して検証できない場合、リクエストを拒否します。
- クライアント証明書がない場合でも、すべてのリクエストをバックエンドに渡します。
アップロードされた PKI アンカーに対してクライアント証明書の検証を行います。複数の PKI アンカーを個別に追加し、ダウンタイムなしで古い PKI から新しい PKI に移行できます。
指定した PKI アンカーに対する検証パスの構築に使用する中間証明書を指定します。中間証明書を使用すると、完全な証明書チェーンを渡さないクライアントで mTLS を使用できます。
証明書のフィンガープリントを生成し、カスタム リクエスト ヘッダーとしてバックエンドに渡します。
カスタム リクエスト ヘッダーを使用して、証明書から抽出した特定のフィールドをバックエンドに渡します。
カスタム リクエスト ヘッダーを使用して、検証結果と検証エラーをバックエンドに渡します。
検証プロセスの詳細な説明ついては、このページのクライアント証明書の検証手順セクションをご覧ください。
MTLS クライアント検証モード
クライアントがロードバランサに無効な証明書を提示するか、証明書を提示しない場合は、clientValidationMode
でクライアント接続の処理方法を指定します。
clientValidationMode
の値は次のとおりです。
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
を使用すると、クライアント証明書の証明書チェーン検証が失敗した場合や、クライアント証明書が提示されていない場合でも、クライアントからの接続が許可されます。クライアント証明書が提供されたときに、秘密鍵の所有者証明が常にチェックされます。このモードでカスタム ヘッダー変数を使用すると、クライアントが証明書を提供したかどうかや、証明書の検証が成功したかどうかをバックエンドに通知できます。また、証明書から抽出されたその他の情報を提供することもできます。
REJECT_INVALID
は、クライアントが証明書を提供しない場合、または証明書の検証で不合格だった場合に接続を拒否します。
バックエンド サービスでロギングが有効になっている場合は、mTLS クライアント証明書の検証ログを表示できます。
バックエンドに渡されるカスタム ヘッダー値
次の表に、常にバックエンドに渡される相互 TLS カスタム ヘッダーの変数値を示します(リクエスト タイプは「バックエンドにリクエストを渡す」)。clientValidationMode
が ALLOW_INVALID_OR_MISSING_CLIENT_CERT
に設定されている場合、またはクライアント証明書が証明書の検証に合格した場合、カスタム ヘッダーがバックエンドに渡されます。
クライアント証明書のステータス | clientValidationMode | カスタム ヘッダー |
---|---|---|
クライアント証明書チェーンが長すぎる(クライアント証明書に 10 を超える中間証明書が含まれる)。 |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
クライアントまたは中間証明書の RSA 鍵のサイズが無効。 検証は実行されません。 RSA 鍵の長さは 2,048~4,096 ビットです。 |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
クライアント証明書または中間証明書が、サポートされていない楕円曲線を使用している。 検証は実行されません。 有効な楕円曲線は P-256 と P-384 です。 |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
クライアント証明書または中間証明書が、RSA 以外、ECDSA 以外のアルゴリズムを使用している。 検証は実行されません。 |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
検証に使用する PKI に、同じサブジェクトとサブジェクトの公開鍵情報を共有する 11 個以上の中間証明書がある。 検証は実行されません。 |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
検証に指定された中間証明書に 10 を超える名前の制約がある。 |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
クライアント証明書に、 |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
証明書チェーンの検証中に制限時間を超過した。 | ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
client_cert_sha256_fingerprint: <cert hash>
|
証明書チェーンの検証中に、深度または反復処理の上限に達した。 証明書チェーンの最大深度は、ルート証明書とクライアント証明書を含めて 10 です。反復処理の最大回数は 100(クライアント証明書チェーンの検証のために確認される証明書)です。 |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
検証は実行できませんが、証明書ハッシュはバックエンドに転送されます。 |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
クライアント証明書がない。 | ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
クライアント証明書で TrustConfig リソースに対する検証に失敗した。 |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
クライアント証明書で証明書確認検証に合格した。 | 該当なし |
client_cert_error: <empty>
|
閉じた接続についてログに記録されたエラー
次のエラーでは、clientValidationMode
が ALLOW_INVALID_OR_MISSING_CLIENT_CERT
または REJECT_INVALID
に設定されている場合に、クライアント接続が終了します。詳細については、statusDetails HTTP 失敗メッセージをご覧ください。これらのエラーは Cloud Logging に記録されます。詳細を次の表に示します。
クライアント証明書のステータス | リクエスト | ロギングされたエラー |
---|---|---|
handshake 中にクライアント証明書が署名一致に失敗する。 | SSL handshake を終了します。 | なし |
サービスで証明書チェーンの検証を実行できない。 | 接続を終端します。 |
client_cert_validation_unavailable
|
証明書チェーンの検証中に内部エラーが発生した。 | 接続を終端します。 |
client_cert_validation_internal_error
|
一致する TrustConfig が見つからない。 |
接続を終端します。 |
client_cert_trust_config_not_found
|
クライアント証明書のペイロード(中間証明書を含む)が大きすぎる(16 KB 超)。 | 接続を終端します。 |
client_cert_exceeded_size_limit
|
REJECT_INVALID
検証でログに記録されたエラー
clientValidationMode
が REJECT_INVALID
に設定されている場合、次のエラーが発生して接続が終了します(リクエスト タイプは「接続の終端」)。詳細については、statusDetails HTTP 失敗メッセージをご覧ください。これらのエラーは Cloud Logging に記録されます。詳細を次の表に示します。
クライアント証明書のステータス | ロギングされたエラー |
---|---|
クライアント証明書チェーンが長すぎる(クライアント証明書に 10 を超える中間証明書が含まれる)。 |
client_cert_chain_exceeded_limit
|
クライアントまたは中間証明書の RSA 鍵のサイズが無効。 検証は実行されません。 RSA 鍵の長さは 2,048~4,096 ビットです。 |
client_cert_invalid_rsa_key_size
|
クライアント証明書または中間証明書で、サポートされていない楕円曲線が使用されています。 検証は実行されません。 有効な曲線は P-256 と P-384 です。 |
client_cert_unsupported_elliptic_curve_key
|
クライアント証明書または中間証明書が、非 RSA または ECDSA 以外のアルゴリズムを使用しています。 検証は実行されません。 |
client_cert_unsupported_key_algorithm
|
検証に使用する PKI に、同じサブジェクトとサブジェクトの公開鍵情報を共有する 11 個以上の中間証明書がある。 検証は実行されません。 |
client_cert_pki_too_large
|
検証に指定された中間証明書に 10 を超える名前の制約がある。 |
|
クライアント証明書に、 |
|
証明書チェーンの検証中に制限時間を超過した。 |
client_cert_validation_timed_out
|
証明書チェーンの検証中に、深度または反復処理の上限に達しました。 証明書チェーンの最大深度は、ルート証明書とクライアント証明書を含めて 10 です。反復処理の上限は 100 回です(クライアント証明書チェーンの検証のために確認された証明書)。 |
client_cert_validation_search_limit_exceeded
|
TrustConfig リソースを設定せずに mTLS を構成した。 |
client_cert_validation_not_performed
|
クライアントが handshake 中にリクエストされた証明書を提示しなかった。 |
client_cert_not_provided
|
クライアント証明書が TrustConfig リソースでの検証に失敗する。 |
client_cert_validation_failed
|
クライアント証明書の検証手順
ロードバランサは、クライアント証明書を検証するときに次の処理を行います。
- ロードバランサは、クライアントの署名を検証して、クライアントがクライアント証明書の秘密鍵を所有していることを証明します。このステップが失敗すると、ロードバランサは TLS handshake に常に失敗し、情報がログに記録されません(構成で無効なクライアント証明書やクライアント証明書の欠落が許可されている場合でも失敗します)。
- 構成に
TrustAnchor
が含まれている場合、ロードバランサはクライアント証明書と構成済みのTrustAnchor
間の信頼のチェーンを検証します。具体的には、ロードバランサは次のことを確認します。- クライアント、中間証明書、ルート証明書が証明書の要件を満たしている。
- 親証明書のサブジェクト フィールドが子証明書の問題フィールドと一致している。
- 親証明書のサブジェクト鍵 ID(SKID)が子証明書の認証機関鍵 ID(AKID)と一致している。
- 子証明書の SAN が親証明書の
NameConstraints
フィールドに違反していない。
- 信頼チェーンの検証が成功した場合、リクエストはエンドポイント用に構成された mTLS カスタム ヘッダーを使ってバックエンドに転送されます。
- 信頼チェーンの検証が失敗した場合:
ClientValidationMode
がREJECT_INVALID
に設定されている場合、ロードバランサは接続を終了し、理由を Cloud Logging にログ記録します。ClientValidationMode
がALLOW_INVALID_OR_MISSING_CLIENT_CERTIFICATE
に設定されている場合でも、ロードバランサはリクエストをバックエンドに転送します。カスタム リクエスト ヘッダーを使用すると、検証が失敗したバックエンドと、失敗した理由を示すことができます。クロスリージョン内部アプリケーション ロードバランサ、リージョン外部アプリケーション ロードバランサ、またはリージョン内部アプリケーション ロードバランサの場合は、カスタム リクエスト ヘッダーに加えて mTLS オプション フィールドを構成して、失敗の理由を確認できます。
証明書の要件
- 証明書では RSA または ECDSA 暗号を使用する必要があります。
- クライアント(リーフ)証明書の場合:
- ルート証明書と中間証明書の場合:
制限事項
ロードバランサは、クライアント証明書の失効チェックを行いません。
アプリケーション ロードバランサでは、100 個のトラスト アンカーと 100 個の中間証明書、許可リストに登録済みの 500 個の証明書を含む 1 つのトラストストアを使用して、信頼構成をアップロードできます。すべての中間証明書で、同じサブジェクトとサブジェクトの公開鍵情報を共有する証明書を 3 個以下にする必要があります。詳細については、割り当てと上限をご覧ください。
証明書チェーンの最大深度は、ルート証明書とクライアント証明書を含めて 10 です。信頼チェーンを構築する際に中間証明書を評価できる最大回数は 100 です。詳細については、割り当てと上限をご覧ください。
クライアントからアップロードされ、渡される証明書の鍵は、次のものに制限されます。
- RSA 鍵の長さは 2,048~4,096 ビットです。詳細については、割り当てと上限をご覧ください。
- ECDSA 鍵では、P-256 または P-384 曲線を使用できます。
クライアントから受信可能な証明書チェーンは、最大 16 KB、10 個の証明書に制限されています。詳細については、割り当てと上限をご覧ください。
検証に使用するルート証明書には、10 個を超える名前の制約を含めることはできません。詳細については、割り当てと上限をご覧ください。
自己署名クライアント証明書は、ロードバランサで常に無効とみなされます。