Dialogflow が Webhook リクエストに対して開始するネットワーク トラフィックは、パブリック ネットワークで送信されます。両方向のトラフィックの安全性と信頼性を確保するため、Dialogflow は相互 TLS 認証(mTLS)をオプションでサポートします。Dialogflow の標準 TLS handshake 中に、Webhook サーバーは認証局チェーンに従うか、証明書をカスタム CA 証明書と比較して、Dialogflow で検証できる証明書を提示します。Webhook サーバーで mTLS を有効にすると、Dialogflow がを検証のために Webhook サーバーに提示した Google 証明書を認証して、相互信頼の確立を完了します。
mTLS のリクエスト
mTLS をリクエストするには:
- Webhook HTTPS サーバーが TLS handshake 中にクライアント証明書をリクエストするように、準備をします。
- Webhook サーバーは、クライアント証明書の受信時に、この証明書を検証する必要があります。
クライアントとサーバーの両方で相互に信頼できる Webhook サーバーの証明書チェーンをインストールします。Google サービスに接続するアプリケーションは、Google Trust Services によって一覧表示されているすべての認証局を信頼する必要があります。ルート証明書は https://pki.goog/ からダウンロードできます。
mTLS を使用した Webhook サーバーへの呼び出しの例
この例では、クイックスタートで説明したエージェントと、openssl
を実行する Webhook サーバーを併用します。
- 設定例
- Dialogflow CX エージェントがシャツの注文を受け取り、スタンドアロン ウェブサーバーを指す Webhook に送信します。
key.pem
という名前のファイルの TLS 通信用の秘密鍵。fullchain.pem
という名前のファイルで、公的に信頼できる CA(認証局)によって署名された証明書チェーン。
-
サーバーマシンで
openssl s_server
プログラムを実行します。sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
- クライアント マシンからエージェントにリクエストが送信されます。この例では、リクエストは「赤い L サイズのシャツを買いたい」です。このリクエストは、Dialogflow コンソールを使用するか、API 呼び出しによって送信できます。
-
サーバーマシンの
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
ベスト プラクティス
独自の 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 は信頼される必要があります。 |