Dialogflow 针对网络钩子请求发起的网络流量通过公共网络发送。为了确保每个方向的流量都安全可靠又可信任,Dialogflow 还可视需要支持双向 TLS 身份验证 (mTLS)。在 Dialogflow 的标准 TLS 握手期间, 您的网络钩子服务器会提供一个证书,该证书可由 Dialogflow 验证, 可以通过遵循证书授权机构链 也可以将该证书与自定义 CA 证书进行比较。 通过在 webhook 服务器上启用 mTLS,它能够进行身份验证 Dialogflow 提供的 Google 证书 到 webhook 服务器进行验证,以完成与 webhook 服务器之间的 信任。
请求 mTLS
如需请求 mTLS,请执行以下操作:
- 对您的 webhook HTTPS 服务器进行准备,以在 TLS 握手期间请求客户端证书。
- 网络钩子服务器应在收到客户端证书时对其进行验证。
为您的 webhook 服务器安装证书链,客户端和服务器共同信任该证书链。连接到 Google 服务的应用应信任 Google Trust Services 列出的所有证书授权机构。您可以从以下网址下载根证书:https://pki.goog/。
使用 mTLS 调用 webhook 服务器的示例
此示例使用快速入门中所示的代理,
webhook 服务器
跑步
openssl
。
- 示例设置
<ph type="x-smartling-placeholder">
- </ph>
- Dialogflow CX 代理,负责接受衬衫订单,并将其发送给 指向独立 Web 服务器的 webhook。
- 用于 TLS 通信的私钥,位于名为
key.pem
。 - 由
受大众信任
CA(证书授权机构)位于名为
fullchain.pem
的文件中。
-
在服务器中执行
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 请求是由您自己的 Dialogflow 代理发起的, 您应验证 Bearer 服务身份令牌 。或者,您也可以验证会话 参数。
错误
如果客户端证书验证失败 (例如,webhook 服务器不信任客户端证书)。 TLS 握手失败,会话终止。
常见的错误消息:
错误消息 | 说明 |
---|---|
Failed to verify client's certificate: x509: certificate signed by unknown authority(未能验证客户端的证书:x509:证书由未知授权机构签署) | Dialogflow 将其客户端证书发送到了外部网络钩子,但外部网络钩子无法对其进行验证。这可能是因为外部网络钩子未正确安装 CA 链。系统应信任 Google 的所有根 CA。 |