相互 TLS 認証

通常、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 証明書で識別されます。

    トラストストアには、次の種類のクライアント証明書をアップロードできます。

次の図は、mTLS コンポーネントを示しています。

グローバル

次の図は、外部アプリケーション ロードバランサのデプロイのコンポーネントを示しています。このアーキテクチャは、クロスリージョン内部アプリケーション ロードバランサ(グローバル コンポーネントを使用する内部アプリケーション ロードバランサ)にも適用されます。

グローバル外部アプリケーション ロードバランサ コンポーネントを使用した相互 TLS。
図 1. グローバル外部アプリケーション ロードバランサ コンポーネントを使用した相互 TLS(クリックして拡大)

リージョン

次の図は、リージョン内部アプリケーション ロードバランサのデプロイのコンポーネントを示しています。このアーキテクチャは、リージョン外部アプリケーション ロードバランサ(リージョン コンポーネントを使用する外部アプリケーション ロードバランサ)にも適用されます。

リージョン内部アプリケーション ロードバランサ コンポーネントを使用した相互 TLS。
図 1. リージョン内部アプリケーション ロードバランサ コンポーネントを使用した相互 TLS(クリックして拡大)

アプリケーション ロードバランサのデプロイのコンポーネントの詳細については、次のセクションをご覧ください。

機能

mTLS でサポートされているロードバランサの機能を使用すると、次のことができます。

  • クライアントが提示した証明書の秘密鍵を所有していることを証明します。

  • クライアント証明書を次のいずれかのモードで検証します。

    • クライアント証明書チェーンをトラストストアに対して検証できない場合、リクエストを拒否します。
    • クライアント証明書がない場合でも、すべてのリクエストをバックエンドに渡します。
  • アップロードされた PKI アンカーに対してクライアント証明書の検証を行います。複数の PKI アンカーを個別に追加し、ダウンタイムなしで古い PKI から新しい PKI に移行できます。

  • 指定した PKI アンカーに対する検証パスの構築に使用する中間証明書を指定します。中間証明書を使用すると、完全な証明書チェーンを渡さないクライアントで mTLS を使用できます。

  • 証明書のフィンガープリントを生成し、カスタム リクエスト ヘッダーとしてバックエンドに渡します。

  • カスタム リクエスト ヘッダーを使用して、証明書から抽出した特定のフィールドをバックエンドに渡します。

  • カスタム リクエスト ヘッダーを使用して、検証結果と検証エラーをバックエンドに渡します。

検証プロセスの詳細な説明ついては、このページのクライアント証明書の検証手順セクションをご覧ください。

MTLS クライアント検証モード

クライアントがロードバランサに無効な証明書を提示するか、証明書を提示しない場合は、clientValidationMode でクライアント接続の処理方法を指定します。

clientValidationMode の値は次のとおりです。

  • ALLOW_INVALID_OR_MISSING_CLIENT_CERT を使用すると、クライアント証明書の証明書チェーン検証が失敗した場合や、クライアント証明書が提示されていない場合でも、クライアントからの接続が許可されます。クライアント証明書が提供されたときに、秘密鍵の所有者証明が常にチェックされます。

    このモードでカスタム ヘッダー変数を使用すると、クライアントが証明書を提供したかどうかや、証明書の検証が成功したかどうかをバックエンドに通知できます。また、証明書から抽出されたその他の情報を提供することもできます。

  • REJECT_INVALID は、クライアントが証明書を提供しない場合、または証明書の検証で不合格だった場合に接続を拒否します。

バックエンド サービスでロギングが有効になっている場合は、mTLS クライアント証明書の検証ログを表示できます。

バックエンドに渡されるカスタム ヘッダー値

次の表に、常にバックエンドに渡される相互 TLS カスタム ヘッダーの変数値を示します(リクエスト タイプは「バックエンドにリクエストを渡す」)。clientValidationModeALLOW_INVALID_OR_MISSING_CLIENT_CERT に設定されている場合、またはクライアント証明書が証明書の検証に合格した場合、カスタム ヘッダーがバックエンドに渡されます。

クライアント証明書のステータス clientValidationMode カスタム ヘッダー

クライアント証明書チェーンが長すぎる(クライアント証明書に 10 を超える中間証明書が含まれる)。

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_exceeded_limit

client_cert_sha256_fingerprint: <cert hash>

クライアントまたは中間証明書の RSA 鍵のサイズが無効。

検証は実行されません。

RSA 鍵の長さは 2,048~4,096 ビットです。

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_invalid_rsa_key_size

client_cert_sha256_fingerprint: <cert hash>

クライアント証明書または中間証明書が、サポートされていない楕円曲線を使用している。

検証は実行されません。

有効な楕円曲線は P-256 と P-384 です。

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_unsupported_elliptic_curve_key

client_cert_sha256_fingerprint: <cert hash>

クライアント証明書または中間証明書が、RSA 以外、ECDSA 以外のアルゴリズムを使用している。

検証は実行されません。

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_unsupported_key_algorithm

client_cert_sha256_fingerprint: <cert hash>

検証に使用する PKI に、同じサブジェクトとサブジェクトの公開鍵情報を共有する 11 個以上の中間証明書がある。

検証は実行されません。

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_pki_too_large

client_cert_sha256_fingerprint: <cert hash>

検証に指定された中間証明書に 10 を超える名前の制約がある。

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_max_name_constraints_exceeded

client_cert_sha256_fingerprint: <cert hash>

クライアント証明書に、clientAuth を含む Extended Key Usage (EKU) がない。

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_invalid_eku

client_cert_sha256_fingerprint: <cert hash>

証明書チェーンの検証中に制限時間を超過した。 ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_timed_out

client_cert_sha256_fingerprint: <cert hash>

証明書チェーンの検証中に、深度または反復処理の上限に達した。

証明書チェーンの最大深度は、ルート証明書とクライアント証明書を含めて 10 です。反復処理の最大回数は 100(クライアント証明書チェーンの検証のために確認される証明書)です。

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_search_limit_exceeded

client_cert_sha256_fingerprint: <cert hash>

TrustConfig リソースを設定せずに mTLS を構成した。

検証は実行できませんが、証明書ハッシュはバックエンドに転送されます。

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_not_performed

client_cert_sha256_fingerprint: <cert hash>

クライアント証明書がない。 ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: false

client_cert_chain_verified: false

client_cert_error: client_cert_not_provided

client_cert_sha256_fingerprint: <empty>

クライアント証明書で TrustConfig リソースに対する検証に失敗した。 ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_failed

client_cert_sha256_fingerprint: <cert hash>

クライアント証明書で証明書確認検証に合格した。 該当なし

client_cert_present: true

client_cert_chain_verified: true

client_cert_error: <empty>

client_cert_sha256_fingerprint: <cert hash>

client_cert_serial_number: <serial_number>

client_cert_valid_not_before: <date>

client_cert_valid_not_after: <date>

client_cert_uri_sans: <list>

client_cert_dnsname_sans: <list>

client_cert_issuer_dn: <issuer>

client_cert_subject_dn: <subject>

client_cert_leaf: <certificate>

client_cert_chain: <list>

閉じた接続についてログに記録されたエラー

次のエラーでは、clientValidationModeALLOW_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 検証でログに記録されたエラー

clientValidationModeREJECT_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_chain_max_name_constraints_exceeded

クライアント証明書に、clientAuth を含む Extended Key Usage (EKU) 拡張機能がない。

client_cert_chain_invalid_eku

証明書チェーンの検証中に制限時間を超過した。 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

クライアント証明書の検証手順

ロードバランサは、クライアント証明書を検証するときに次の処理を行います。

  1. ロードバランサは、クライアントの署名を検証して、クライアントがクライアント証明書の秘密鍵を所有していることを証明します。このステップが失敗すると、ロードバランサは TLS handshake に常に失敗し、情報がログに記録されません(構成で無効なクライアント証明書やクライアント証明書の欠落が許可されている場合でも失敗します)。
  2. 構成に TrustAnchor が含まれている場合、ロードバランサはクライアント証明書と構成済みの TrustAnchor 間の信頼のチェーンを検証します。具体的には、ロードバランサは次のことを確認します。
    • クライアント、中間証明書、ルート証明書が証明書の要件を満たしている。
    • 親証明書のサブジェクト フィールドが子証明書の問題フィールドと一致している。
    • 親証明書のサブジェクト鍵 ID(SKID)が子証明書の認証機関鍵 ID(AKID)と一致している。
    • 子証明書の SAN が親証明書の NameConstraints フィールドに違反していない。
  3. 信頼チェーンの検証が成功した場合、リクエストはエンドポイント用に構成された mTLS カスタム ヘッダーを使ってバックエンドに転送されます。
  4. 信頼チェーンの検証が失敗した場合:
    • ClientValidationModeREJECT_INVALID に設定されている場合、ロードバランサは接続を終了し、理由を Cloud Logging にログ記録します。
    • ClientValidationModeALLOW_INVALID_OR_MISSING_CLIENT_CERTIFICATE に設定されている場合でも、ロードバランサはリクエストをバックエンドに転送します。カスタム リクエスト ヘッダーを使用すると、検証が失敗したバックエンドと、失敗した理由を示すことができます。クロスリージョン内部アプリケーション ロードバランサ、リージョン外部アプリケーション ロードバランサ、またはリージョン内部アプリケーション ロードバランサの場合は、カスタム リクエスト ヘッダーに加えて mTLS オプション フィールドを構成して、失敗の理由を確認できます。

証明書の要件

  • 証明書では RSA または ECDSA 暗号を使用する必要があります。
  • クライアント(リーフ)証明書の場合:
    • 基本制約の拡張機能には CA=true を含めないでください。
    • 鍵の拡張的用途の拡張機能には、clientAuth を含める必要があります。
    • 鍵の拡張的用途の拡張機能には、codeSigningtimeStampingOCSPSigning フィールドを含めないでください。
    • 証明書の有効期限内である必要があります。
    • クライアント証明書を自己署名証明書にすることはできません。
  • ルート証明書と中間証明書の場合:
    • 基本制約の拡張機能には CA=true を含める必要があります。
    • 鍵の使用の拡張機能は keyCertSign に設定する必要があります。
    • 鍵の拡張的用途の拡張機能には、clientAuth フィールドが含まれている必要があります。
    • 証明書の有効期限内である必要があります。

制限事項

  • ロードバランサは、クライアント証明書の失効チェックを行いません。

  • アプリケーション ロードバランサでは、100 個のトラスト アンカーと 100 個の中間証明書、許可リストに登録済みの 500 個の証明書を含む 1 つのトラストストアを使用して、信頼構成をアップロードできます。すべての中間証明書で、同じサブジェクトとサブジェクトの公開鍵情報を共有する証明書を 3 個以下にする必要があります。詳細については、割り当てと上限をご覧ください。

  • 証明書チェーンの最大深度は、ルート証明書とクライアント証明書を含めて 10 です。信頼チェーンを構築する際に中間証明書を評価できる最大回数は 100 です。詳細については、割り当てと上限をご覧ください。

  • クライアントからアップロードされ、渡される証明書の鍵は、次のものに制限されます。

    • RSA 鍵の長さは 2,048~4,096 ビットです。詳細については、割り当てと上限をご覧ください。
    • ECDSA 鍵では、P-256 または P-384 曲線を使用できます。
  • クライアントから受信可能な証明書チェーンは、最大 16 KB、10 個の証明書に制限されています。詳細については、割り当てと上限をご覧ください。

  • 検証に使用するルート証明書には、10 個を超える名前の制約を含めることはできません。詳細については、割り当てと上限をご覧ください。

  • 自己署名クライアント証明書は、ロードバランサで常に無効とみなされます。

次のステップ