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 CX 客服,用于接收衬衫订单,并将其发送到指向独立 Web 服务器的网络钩子。
- 名为
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
- 从客户端计算机向代理发送请求。在此示例中,请求为“我想买一件大码红色衬衫”。您可以使用 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: 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。 |