雙向傳輸層安全標準 (TLS) 驗證

Dialogflow 啟動的網路流量 (用於 Webhook 要求) 會透過公用網路傳送。為確保雙向流量安全無虞,Dialogflow 可選擇性支援相互傳輸層安全標準 (mTLS) 驗證。在 Dialogflow 的標準 TLS 握手期間,您的 Webhook 伺服器會提供可供 Dialogflow 驗證的憑證,驗證方式包括追蹤憑證授權單位鏈結,或將憑證與自訂 CA 憑證進行比較。在 Webhook 伺服器上啟用 mTLS 後,Webhook 伺服器就能驗證 Dialogflow 提供的 Google 憑證,完成相互信任的建立程序。

要求 mTLS

如要要求 mTLS,請按照下列步驟操作:

  1. 準備 Webhook HTTPS 伺服器,在 TLS 握手期間要求用戶端憑證。
  2. Webhook 伺服器收到用戶端憑證後,應立即驗證。
  3. 為 Webhook 伺服器安裝憑證鏈,讓用戶端和伺服器都能互相信任。連線至 Google 服務的應用程式應信任 Google Trust Services 列出的所有憑證授權單位。您可以從以下網址下載根憑證: https://pki.goog/

使用 mTLS 呼叫 Webhook 伺服器的範例

本範例使用快速入門導覽課程中顯示的代理程式,以及執行 opensslwebhook 伺服器。

  1. 設定範例
    1. Dialogflow CX 虛擬服務專員,可接受襯衫訂單,並將訂單傳送至指向獨立網頁伺服器的 Webhook。
    2. 用於 TLS 通訊的私密金鑰,位於名為 key.pem 的檔案中。
    3. 公開信任的憑證授權單位 (CA) 簽署的憑證鏈,位於名為 fullchain.pem 的檔案中。
  2. 在伺服器機器中執行 openssl s_server 程式。
    sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
  3. 要求會從用戶端電腦傳送給代理程式。以這個範例來說,要求是「I want to buy a large red shirt」(我想買一件大號紅色襯衫)。您可以透過 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 時,系統會在握手期間提供設定的憑證。

私密金鑰和通關密語會設定為 Secret Manager 資源。您必須授予 Dialogflow 服務代理 Secret Manager 密鑰存取者權限,才能存取密鑰。

用戶端憑證必須由憑證授權單位簽署,才能順利完成信號交換。

最佳做法

為確保 Webhook 要求是由您自己的 Dialogflow 代理程式發起,請驗證要求授權標頭中的 Bearer 服務身分識別權杖。或者,您也可以驗證先前由您端的驗證伺服器提供的會期參數。

錯誤

如果用戶端憑證驗證失敗 (例如 Webhook 伺服器不信任用戶端憑證),TLS 握手就會失敗,工作階段也會終止。

常見錯誤訊息:

錯誤訊息 說明
無法驗證用戶端憑證:x509:憑證由不明授權單位簽署 Dialogflow 會將用戶端憑證傳送至外部 Webhook,但外部 Webhook 無法驗證該憑證。這可能是因為外部 Webhook 未正確安裝 CA 鏈結。應信任 Google 的所有根 CA。