Dialogflow 為 Webhook 要求啟動的網路流量會透過公用網路傳送。為確保流量在雙向傳輸時都安全且可信任,Dialogflow 可選擇支援雙向傳輸層安全標準 (mTLS) 驗證。在 Dialogflow 的標準 TLS 握手期間,您的 webhook 伺服器會提供可由 Dialogflow 驗證的憑證,方法是遵循憑證授權單位鏈結或將憑證與自訂 CA 憑證進行比較。在 webhook 伺服器上啟用 mTLS 後,該伺服器就能驗證 Dialogflow 提供給 webhook 伺服器的 Google 憑證,完成建立互信。
要求使用 mTLS
如要要求使用 mTLS:
- 準備 webhook HTTPS 伺服器,在 TLS 握手期間要求用戶端憑證。
- 您的 webhook 伺服器應在收到用戶端憑證時驗證該憑證。
- 為 webhook 伺服器安裝憑證鏈,讓用戶端和伺服器都能相互信任。連線至 Google 服務的應用程式應信任 Google Trust Services 列出的所有憑證授權單位。您可以前往 https://pki.goog/ 下載根憑證。
使用 mTLS 呼叫 Webhook 伺服器的範例
本範例會使用快速入門導覽課程中顯示的代理程式,搭配執行 webhook 伺服器的 openssl
。
- 設定範例
- 接收上衣訂單並傳送至指向獨立網路伺服器的 Webhook 的 Dialogflow CX 代理程式。
- 用於 TLS 通訊的私密金鑰,位於名為
key.pem
的檔案中。 - 在名為
fullchain.pem
的檔案中,由公認信任的 CA (憑證授權單位) 簽署的憑證鏈。
-
在伺服器機器中執行
openssl s_server
程式。sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
- 從用戶端電腦傳送要求給代理程式。以這個範例來說,要求是「我想買一件紅色大尺寸的襯衫」。您可以透過 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
自訂用戶端憑證
您可以在代理程式層級設定自訂用戶端憑證,讓所有 webhook 都能使用。在呼叫 webhook 時,系統會在握手期間提供已設定的憑證。
私密金鑰和密碼短語會設為 Secret Manager 資源。您必須為 Dialogflow 服務代理授予 Secret Manager 密鑰存取者權限。
用戶端憑證必須經過憑證授權單位簽署,才能順利完成握手程序。
最佳做法
為確保 webhook 要求是由您自己的 Dialogflow 代理程啟動,請從要求的 Authorization 標頭驗證 Bearer 服務身分權杖。或者,您也可以驗證先前由您端驗證伺服器提供的會話參數。
錯誤
如果用戶端憑證驗證失敗 (例如 webhook 伺服器不信任用戶端憑證),TLS 握手就會失敗,且工作階段會終止。
常見錯誤訊息:
錯誤訊息 | 說明 |
---|---|
無法驗證用戶端憑證:x509:憑證由不明授權單位簽署 | Dialogflow 會將用戶端憑證傳送至外部 Webhook,但外部 Webhook 無法驗證。這可能是因為外部 webhook 未正確安裝 CA 鏈結。應信任 Google 的所有根 CA。 |