双向 TLS 身份验证

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

请求 mTLS

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

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

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

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

  1. 示例设置
    1. 一个 Dialogflow ES 代理,用于问候最终用户并查询 指向独立 Web 服务器的 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. 请求从客户端机器发送到代理。在此示例中,请求为“Hi”。此请求可使用 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: 0x6A6A:...
    Shared Elliptic groups: X25519:...
    CIPHER is TLS_AES_128_GCM_SHA256
    Secure Renegotiation IS NOT supported
    POST /dialogflowFulfillment HTTP/1.1
    authorization: Bearer ey...
    content-type: application/json
    Host: www.example.com
    Content-Length: 1011
    Connection: keep-alive
    Accept: */*
    User-Agent: Google-Dialogflow
    Accept-Encoding: gzip, deflate, br
    
    {
      "responseId": "96c0029a-149d-4f5d-b225-0b0bb0f0c8d9-afbcf665",
      "queryResult": {
        "queryText": "Hi",
        "action": "input.welcome",
        "parameters": {
        },
        "allRequiredParamsPresent": true,
        "outputContexts": [{
          "name": "projects/PROJECT-ID/agent/sessions/58ab33f3-b57a-aae9-fb23-8306242d4871/contexts/__system_counters__",
          "parameters": {
            "no-input": 0.0,
            "no-match": 0.0
          }
        }],
        "intent": {
          "name": "projects/PROJECT-ID/agent/intents/399277d6-2ed7-4329-840d-8baa0f60480e",
          "displayName": "Default Welcome Intent"
        },
        "intentDetectionConfidence": 1.0,
        "languageCode": "en",
        "sentimentAnalysisResult": {
          "queryTextSentiment": {
            "score": 0.2,
            "magnitude": 0.2
          }
        }
      },
      "originalDetectIntentRequest": {
        "source": "DIALOGFLOW_CONSOLE",
        "payload": {
        }
      },
      "session": "projects/PROJECT-ID/agent/sessions/58ab33f3-b57a-aae9-fb23-8306242d4871"
    }ERROR
    shutting down SSL
    CONNECTION CLOSED
          

最佳做法

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

错误

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

常见的错误消息:

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