相互 TLS 認証

Dialogflow が Webhook リクエストに対して開始するネットワーク トラフィックは、パブリック ネットワークで送信されます。両方向のトラフィックの安全性と信頼性を確保するため、Dialogflow は相互 TLS 認証(mTLS)をオプションでサポートします。Dialogflow の標準 TLS handshake 中に、Webhook サーバーは認証局チェーンに従うか、証明書をカスタム CA 証明書と比較して、Dialogflow で検証できる証明書を提示します。Webhook サーバーで mTLS を有効にすると、Dialogflow がを検証のために Webhook サーバーに提示した Google 証明書を認証して、相互信頼の確立を完了します。

mTLS のリクエスト

mTLS をリクエストするには:

  1. Webhook HTTPS サーバーが TLS handshake 中にクライアント証明書をリクエストするように、準備をします。
  2. Webhook サーバーは、クライアント証明書の受信時に、この証明書を検証する必要があります。
  3. クライアントとサーバーの両方で相互に信頼できる Webhook サーバーの証明書チェーンをインストールします。Google サービスに接続するアプリケーションは、Google Trust Services によって一覧表示されているすべての認証局を信頼する必要があります。ルート証明書は https://pki.goog/ からダウンロードできます。

mTLS を使用した Webhook サーバーへの呼び出しの例

この例では、webhook サーバーで openssl を実行している、クイックスタートで説明したエージェントを使用します。

  1. 設定例
    1. Dialogflow CX エージェントがシャツの注文を受け取り、スタンドアロン ウェブサーバーを指す Webhook に送信します。
    2. key.pem という名前のファイルの TLS 通信用の秘密鍵。
    3. fullchain.pem という名前のファイルで、公的に信頼できる CA(認証局)によって署名された証明書チェーン。
  2. サーバーマシンで openssl s_server プログラムを実行します。
    sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
  3. クライアント マシンからエージェントにリクエストが送信されます。この例では、リクエストは「赤い L サイズのシャツを買いたい」です。このリクエストは、Dialogflow コンソールを使用するか、API 呼び出しによって送信できます。
  4. サーバーマシンの openssl s_server の出力。
    verify depth is 1
    Using default temp DH parameters
    ACCEPT
    depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1
    verify return:1
    depth=1 C = US, O = Google Trust Services LLC, CN = GTS CA 1D4
    verify return:1
    depth=0 CN = *.dialogflow.com
    verify return:1
    -----BEGIN SSL SESSION PARAMETERS-----
    MII...
    -----END SSL SESSION PARAMETERS-----
    Client certificate
    -----BEGIN CERTIFICATE-----
    MII...
    -----END CERTIFICATE-----
    subject=CN = *.dialogflow.com
    
    issuer=C = US, O = Google Trust Services LLC, CN = GTS CA 1D4
    
    Shared ciphers:TLS_AES_128_GCM_SHA256:...
    Signature Algorithms: ECDSA+SHA256:...
    Shared Signature Algorithms: ECDSA+SHA256:...
    Peer signing digest: SHA256
    Peer signature type: RSA-PSS
    Supported Elliptic Groups: 0xEAEA:...
    Shared Elliptic groups: X25519:...
    CIPHER is TLS_AES_128_GCM_SHA256
    Secure Renegotiation IS NOT supported
    POST /shirts-agent-webhook HTTP/1.1
    authorization: Bearer ey...
    content-type: application/json
    Host: www.example.com
    Content-Length: 1595
    Connection: keep-alive
    Accept: */*
    User-Agent: Google-Dialogflow
    Accept-Encoding: gzip, deflate, br
    
    {
      "detectIntentResponseId": "a7951ce2-2f00-4af5-a508-4c2cb45698b0",
      "intentInfo": {
        "lastMatchedIntent": "projects/PROJECT_ID/locations/REGION/agents/AGENT_ID/intents/0adebb70-a727-4687-b8bc-fbbc2ac0b665",
        "parameters": {
          "color": {
            "originalValue": "red",
            "resolvedValue": "red"
          },
          "size": {
            "originalValue": "large",
            "resolvedValue": "large"
          }
        },
        "displayName": "order.new",
        "confidence": 0.9978873
      },
      "pageInfo": {
        "currentPage": "projects/PROJECT_ID/locations/REGION/agents/AGENT_ID/flows/00000000-0000-0000-0000-000000000000/pages/06e6fc4d-c2f2-4830-ab57-7a318f20fd90",
        "displayName": "Order Confirmation"
      },
      "sessionInfo": {
        "session": "projects/PROJECT_ID/locations/REGION/agents/AGENT_ID/sessions/session-test-001",
        "parameters": {
          "color": "red",
          "size": "large"
        }
      },
      "fulfillmentInfo": {
        "tag": "confirm"
      },
      "messages": [{
        "text": {
          "text": ["Ok, let\u0027s start a new order."],
          "redactedText": ["Ok, let\u0027s start a new order."]
        },
        "responseType": "ENTRY_PROMPT",
        "source": "VIRTUAL_AGENT"
      }, {
        "text": {
          "text": ["You have selected a large, red shirt."],
          "redactedText": ["You have selected a large, red shirt."]
        },
        "responseType": "HANDLER_PROMPT",
        "source": "VIRTUAL_AGENT"
      }],
      "text": "I want to buy a large red shirt",
      "languageCode": "en"
    }ERROR
    shutting down SSL
    CONNECTION CLOSED
          

カスタム クライアント証明書

カスタム クライアント証明書は、すべての Webhook で使用されるようにエージェント レベルで構成できます。Webhook の呼び出し時に、構成された証明書が handshake 中に提示されます。

秘密鍵とパスフレーズは Secret Manager リソースとして構成されます。Dialogflow サービス エージェントに、シークレットに対する Secret Manager シークレット アクセサーの権限を付与する必要があります。

ハンドシェイクが成功するには、クライアント証明書が認証局によって署名されている必要があります。

ベスト プラクティス

独自の Dialogflow エージェントから確実に Webhook リクエストが行われるようにするには、リクエストの認証ヘッダーからの署名なしのサービス ID トークンを検証する必要があります。または、以前に認証サーバーによって提供されたセッション パラメータを確認することもできます。

エラー

クライアント証明書の検証に失敗した場合(Webhook サーバーがクライアント証明書を信頼していない場合など)、TLS handshake は失敗し、セッションは終了します。

一般的なエラー メッセージ:

エラー メッセージ 説明
Failed to verify client's certificate: x509: certificate signed by unknown authority(クライアントの証明書を検証できませんでした: x509: 不明な権限で署名された証明書) Dialogflow はクライアント証明書を外部 Webhook に送信しましたが、外部 Webhook で検証できませんでした。外部 Webhook で CA チェーンが正しくインストールされなかったことが原因として考えられます。Google のすべてのルート CA は信頼される必要があります。