双向 TLS 身份验证

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

请求 mTLS

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

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

使用 mTLS 对网络钩子服务器进行调用的示例

此示例使用快速入门中所示的代理,并使用运行 网络钩子服务器 openssl

  1. 设置示例
    1. 一个 Dialogflow CX 代理,用于接收衬衫订单,并将其发送到 指向独立 Web 服务器的网络钩子。
    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. 系统会从客户端机器向代理发送请求。在此示例中,请求为 "我想买一件大号红色衬衫"。您可以使用 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
          

自定义客户端证书

您可以在代理级配置自定义客户端证书,以供所有网络钩子使用。在调用网络钩子时,系统会在握手期间提供配置的证书。

私钥和密码短语配置为 Secret Manager 资源。您需要向 Dialogflow 服务代理授予 Secret Manager Secret Accessor 权限,才能访问该密文。

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

最佳做法

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

错误

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

常见的错误消息:

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