Dialogflow 针对网络钩子请求发起的网络流量通过公共网络发送。为了确保每个方向的流量都安全可靠又可信任,Dialogflow 还可视需要支持双向 TLS 身份验证 (mTLS)。在 Dialogflow 的标准 TLS 握手期间,您的网络钩子服务器会提供一个可由 Dialogflow 验证的证书,方法是遵循证书授权机构链或将证书与自定义 CA 证书进行比较。通过在您的 webhook 服务器上启用 mTLS,该服务器将能够对 Dialogflow 向您的 webhook 服务器提供的 Google 证书进行身份验证,以进行验证,从而完成建立互信。
请求 mTLS
如需请求 mTLS,请执行以下操作:
- 对您的 webhook HTTPS 服务器进行准备,以在 TLS 握手期间请求客户端证书。
- 网络钩子服务器应在收到客户端证书时对其进行验证。
- 为您的 webhook 服务器安装证书链,客户端和服务器共同信任该证书链。连接到 Google 服务的应用应信任 Google Trust Services 列出的所有证书授权机构。您可以从以下网址下载根证书:https://pki.goog/。
使用 mTLS 调用 webhook 服务器的示例
此示例使用快速入门中所示的代理,以及运行 openssl
的 webhook 服务器。
- 示例设置
- Dialogflow ES 客服,用于向最终用户致意并查询指向独立 Web 服务器的 webhook。
- 名为
key.pem
的文件中用于 TLS 通信的私钥。 - 名为
fullchain.pem
的文件中包含由受众所信任的 CA (Certificate Authority) 签名的证书链。
-
在服务器机器中执行
openssl s_server
程序。sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
- 从客户端计算机向代理发送请求。在此示例中,请求为“Hi”。您可以使用 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: 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。 |