双向 TLS 身份验证

Dialogflow 针对网络钩子请求发起的网络流量通过公共网络发送。为了确保每个方向的流量都安全可靠又可信任,Dialogflow 还可视需要支持双向 TLS 身份验证 (mTLS)。在 Dialogflow 的标准 TLS 握手期间,您的网络钩子服务器会提供一个可由 Dialogflow 验证的证书,方法是遵循证书授权机构链或将证书与自定义 CA 证书进行比较。通过在您的 webhook 服务器上启用 mTLS,该服务器将能够对 Dialogflow 向您的 webhook 服务器提供的 Google 证书进行身份验证,以进行验证,从而完成建立互信。

请求 mTLS

如需请求 mTLS,请执行以下操作:

  1. 对您的 webhook HTTPS 服务器进行准备,以在 TLS 握手期间请求客户端证书。
  2. 网络钩子服务器应在收到客户端证书时对其进行验证。
  3. 为您的 webhook 服务器安装证书链,客户端和服务器共同信任该证书链。连接到 Google 服务的应用应信任 Google Trust Services 列出的所有证书授权机构。您可以从以下网址下载根证书:https://pki.goog/

使用 mTLS 调用 webhook 服务器的示例

此示例使用快速入门中所示的代理,以及运行 opensslwebhook 服务器。

  1. 示例设置
    1. 一个 Dialogflow CX 客服,用于接收衬衫订单,并将其发送到指向独立 Web 服务器的网络钩子。
    2. 名为 key.pem 的文件中用于 TLS 通信的私钥。
    3. 名为 fullchain.pem 的文件中包含由受众所信任的 CA (Certificate Authority) 签名的证书链。
  2. 在服务器机器中执行 openssl s_server 程序。
    sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
  3. 从客户端计算机向代理发送请求。在此示例中,请求为“我想买一件大码红色衬衫”。您可以使用 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 使用。在调用网络钩子时,系统会在握手期间显示已配置的证书。

私钥和密码会配置为 Secret Manager 资源。您需要向 Dialogflow 服务代理授予对该 Secret 的 Secret Manager Secret Accessor 权限。

客户端证书需要由证书授权机构签名,才能成功进行握手。

最佳做法

为确保从您自己的 Dialogflow 代理发起网络钩子请求,您应验证请求的 Authorization 标头中的 Bearer 服务身份令牌。或者,您也可以验证您端身份验证服务器之前提供的会话参数。

错误

如果客户端证书验证失败(例如,webhook 服务器不信任客户端证书),则 TLS 握手失败,会话终止。

常见的错误消息:

错误消息 说明
Failed to verify client's certificate: x509: certificate signed by unknown authority(未能验证客户端的证书:x509:证书由未知授权机构签署) Dialogflow 将其客户端证书发送到了外部网络钩子,但外部网络钩子无法对其进行验证。这可能是因为外部网络钩子未正确安装 CA 链。系统应信任 Google 的所有根 CA。