相互 TLS の概要

相互 TLS(mTLS)は、クライアントとサーバーの間で相互認証を行うための業界標準プロトコルです。これにより、クライアントとサーバーの両方が、信頼できる認証局(CA)によって発行された有効な証明書を保持していることを確認することで、相互に認証されます。サーバーのみが認証される標準 TLS とは異なり、mTLS では、クライアントとサーバーの両方が証明書を提示し、通信を確立する前に両方の ID を確認する必要があります。

mTLS は、次のすべてのアプリケーション ロードバランサのターゲット HTTPS プロキシ リソースで構成されています。

  • グローバル外部アプリケーション ロードバランサ
  • 従来のアプリケーション ロードバランサ
  • リージョン外部アプリケーション ロードバランサ
  • リージョン内部アプリケーション ロードバランサ
  • クロスリージョン内部アプリケーション ロードバランサ

mTLS は、公開鍵基盤(PKI)を使用して、ネットワーク経由で通信するエンティティの ID を認証します。このインフラストラクチャには、クライアント、サーバー、認証局(CA)の 3 つのコンポーネントが含まれています。ロードバランサの mTLS は、次の機能をサポートしています。

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

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

    • 無効な証明書を拒否する: クライアント証明書チェーンを検証できない場合、リクエストを拒否して厳格な認証を適用します。

    • 無効な証明書または存在しない証明書を許可する: クライアント証明書が欠落しているか無効であっても、すべてのリクエストをバックエンドに渡すことで柔軟性を提供します。

  • アップロードされた PKI アンカー(ルート証明書)に対してクライアント証明書を検証します。複数のアンカーを個別に追加して、ダウンタイムなしで古い PKI から新しい PKI にシームレスに移行できます。

  • 指定した PKI アンカー(ルート証明書)に対するクライアント証明書検証パスの構築に役立つ中間証明書を指定します。これらの中間証明書を使用すると、完全な証明書チェーンを提供しないクライアントでも mTLS を使用できます。

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

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

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

証明書の要件

mTLS の証明書を構成する場合は、次の要件を満たしている必要があります。

  • mTLS 認証の基盤となるのは最新の暗号化ツールです。証明書では、鍵交換に RSA または ECDSA アルゴリズムを使用する必要があります。ハッシュ化アルゴリズムでは、SHA-256 またはより強力な暗号ハッシュ関数を使用する必要があります。MD4、MD5、SHA-1 などのハッシュ化アルゴリズムはサポートされていません。
  • クライアント(リーフ)証明書の場合:
    • 基本制約の拡張機能には CA=true を含めないでください。
    • 鍵の拡張的用途の拡張機能には、clientAuth を含める必要があります。
    • 鍵の拡張的用途の拡張機能には、codeSigningtimeStampingOCSPSigning フィールドを含めないでください。
    • 証明書の有効期限内である必要があります。
    • クライアント証明書を自己署名証明書にすることはできません。
  • ルート証明書と中間証明書の場合:
    • 基本制約の拡張機能には CA=true を含める必要があります。
    • 鍵の使用の拡張機能は keyCertSign に設定する必要があります。
    • 鍵の拡張的用途の拡張機能には、clientAuth フィールドが含まれている必要があります。
    • 証明書の有効期限内である必要があります。

mTLS デプロイのアーキテクチャ

mTLS を使用すると、トラストストアを含む信頼構成リソースを構成できます。トラストストアは、トラスト アンカー(ルート証明書)と、必要に応じて 1 つ以上の中間証明書をカプセル化します。ロードバランサは、クライアント証明書を受信すると、クライアント証明書から構成済みのトラスト アンカーまでの信頼チェーンを確立して、証明書を検証します。

ロードバランサに mTLS を設定する際に構成する必要があるさまざまなリソースの概要は次のとおりです。

  • 信頼構成。単一のトラストストア リソースが含まれており、そのトラストストアがトラスト アンカー(ルート証明書)をカプセル化します。また、必要に応じて 1 つ以上の中間証明書をカプセル化します。信頼構成は、クライアント証明書とトラスト アンカーの間に信頼チェーンを確立するために使用されます。詳細については、信頼構成をご覧ください。

    自己署名された証明書、期限切れの証明書、その他の無効な証明書を使用する必要がある場合、またはルート証明書と中間証明書にアクセスできない場合は、その証明書を allowlistedCertificates フィールドの信頼構成に追加することもできます。証明書を許可リストに追加するためにトラストストアは必要ありません。

    証明書を許可リストに追加すると、証明書が解析可能で、秘密鍵の所有の証明が確立され、証明書の SAN フィールドの制約が満たされている限り、証明書は常に有効とみなされます。

  • トラストストア。信頼チェーンの確立とクライアント証明書の検証に使用されるトラスト アンカーと中間認証局(CA)の証明書が含まれます。CA は、クライアントに信頼できる証明書を発行するために使用されます。CA は、ロードバランサのトラスト アンカー(ルート証明書)または中間 CA 証明書で識別されます。

    トラストストアには、次の種類のルート証明書と中間証明書をアップロードできます。

  • クライアント認証(ServerTLSPolicy とも呼ばれます)。クライアント証明書の検証で使用するクライアント検証モードと信頼構成リソースを指定します。クライアントがロードバランサに無効な証明書を提示するか、証明書を提示しない場合は、クライアント検証モードでクライアント接続の処理方法を指定します。mTLS 認証に関連するすべてのパラメータをサーバー TLS ポリシーで指定できます。クライアント認証(ServerTLSPolicy)リソースがターゲット HTTPS プロキシ リソースに接続されています。

次の図は、グローバル アプリケーション ロードバランサとリージョン アプリケーション ロードバランサのターゲット HTTPS プロキシ リソースに接続されているさまざまな mTLS コンポーネントを示しています。

グローバル

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

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

リージョン

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

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

クライアント検証モード

クライアントがロードバランサに無効な証明書を提示するか、証明書を提示しない場合は、クライアント認証(ServerTLSPolicy)リソースの clientValidationMode 属性により、ロードバランサがクライアント接続を処理する方法が決まります。

クライアント検証モードの値は次のとおりです。

  • ALLOW_INVALID_OR_MISSING_CLIENT_CERT。クライアント証明書の証明書の検証が失敗した場合や、クライアント証明書が提示されていない場合でも、クライアントからの接続が許可されます。このモードでは、ロードバランサはクライアントからの接続を許可し、信頼チェーンを確立できるかどうかに関係なく、すべてのリクエストをバックエンドに渡します。

    クライアント証明書が提供されたときに、秘密鍵の所有者証明が常にチェックされます。クライアントが秘密鍵を所有していることを証明できない場合は、クライアント検証モードで無効なクライアント証明書やクライアント証明書の欠落が許可されている場合でも、TLS handshake は終了します。

  • REJECT_INVALID。クライアントが証明書を提供しない場合、または証明書の検証で不合格だった場合に接続を拒否します。このモードでは、クライアント証明書からトラスト アンカーへの信頼チェーンを確立できない場合、ロードバランサはクライアントからの接続を終了します。

ロードバランサで mTLS を構成する

ロードバランサで mTLS を構成するために必要な主な手順は次のとおりです。

  1. トラスト アンカー(ルート証明書)とルート オブ トラストとして機能する中間証明書を含む信頼構成リソースを作成します。

  2. 信頼構成をクライアント認証(ServerTLSPolicy)リソースにリンクします。これにより、クライアント検証モード(ALLOW_INVALID_OR_MISSING_CLIENT_CERT または REJECT_INVALID)が定義されます。

  3. クライアント認証(ServerTLSPolicy)リソースをロードバランサのターゲット HTTPS プロキシ リソースに接続します。

  4. 省略可: カスタム mTLS ヘッダーを使用して、mTLS 接続に関する情報をバックエンド サービスまたは URL マップに渡すことができます。

この設定の詳細については、次のガイドをご覧ください。

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

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

  1. クライアントが秘密鍵を所有していることを確認する

    クライアントは、handshake プロセス中に署名を生成することで、証明書の公開鍵に関連付けられた秘密鍵を保持していることを証明します。ロードバランサは、クライアントの公開鍵を使用してこの署名を検証します。署名の検証に失敗した場合、クライアントが証明書の所有者ではないことを意味します。この場合、構成で無効なクライアント証明書やクライアント証明書の欠落が許可されている場合でも、TLS handshake は終了します。グローバル外部アプリケーション ロードバランサではエラーはロギングされませんが、リージョン外部アプリケーション ロードバランサと内部アプリケーション ロードバランサの proxyStatus フィールドに TLS エラーがロギングされます。

  2. 信頼チェーンを検証する

    ロードバランサは、クライアント証明書と構成済みの信頼構成間の信頼チェーンを検証します。次のことが検証されます。

    • クライアント、中間証明書、ルート証明書が証明書の要件を満たしている。
    • 親証明書のサブジェクト フィールドが子証明書の発行元フィールドと一致している。この検証により、親証明書の ID(サブジェクト)が、子証明書の発行者としてリストされている ID と一致することが確認されます。
    • 親証明書のサブジェクト鍵 ID(SKID)が子証明書の認証機関鍵 ID(AKID)と一致している。この一致は、子証明書が正しいルート認証局によって発行されており、証明書の有効性を検証するために AKID でルートの公開鍵が参照されているため、信頼できることを意味します。
    • 子証明書のサブジェクト代替名(SAN)が親証明書の NameConstraints フィールドに違反していない。
  3. リクエストをバックエンドに転送する

    クライアント証明書の検証が成功すると、リクエストはカスタム mTLS ヘッダーを使用してバックエンドに転送されます。

    ただし、検証が失敗した場合、実行されるアクションはクライアント検証モードの値によって異なります。

    • ALLOW_INVALID_OR_MISSING_CLIENT_CERT: 検証が失敗した理由を示すカスタム mTLS ヘッダーとともにリクエストが転送されます。クロスリージョン内部アプリケーション ロードバランサ、リージョン外部アプリケーション ロードバランサ、またはリージョン内部アプリケーション ロードバランサの場合は、カスタム mTLS ヘッダーに加えて mTLS オプション フィールドを構成して、失敗の理由を確認できます。

    • REJECT_INVALID: 接続が終了し、エラーが Cloud Logging に記録されます

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

次の表に、クライアント証明書が検証に合格した場合と失敗した場合の両方でバックエンドに渡されるカスタム mTLS ヘッダーを示します。クライアント証明書の検証に失敗したときに、クライアント検証モードが ALLOW_INVALID_OR_MISSING_CLIENT_CERT に設定されている場合にのみ、カスタム ヘッダーがバックエンドに渡されます。

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

クライアント証明書チェーンが長すぎる(クライアント証明書に 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>

エラー処理とロギング

アプリケーション ロードバランサには、クライアント証明書の検証のモニタリング、潜在的な問題の特定、接続の問題のトラブルシューティングを可能にする詳細なロギング機能が用意されています。このセクションでは、mTLS 検証中に発生する可能性のあるさまざまなタイプのエラーと、それらのエラーのロギング方法について説明します。

REJECT_INVALID モードでログに記録されたエラー

クライアント証明書の検証が失敗し、クライアント検証モードが REJECT_INVALID に設定されている場合、接続は終了し、エラーが 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

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

クライアント検証モードが ALLOW_INVALID_OR_MISSING_CLIENT_CERT または REJECT_INVALID に設定されている場合、特定のエラーにより接続が終了し、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

バックエンド サービスでロギングが有効になっている場合は、mTLS クライアント証明書の検証中に閉じられた接続についてログに記録されたエラーを表示できます。

制限事項

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

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

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

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

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

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

次のステップ