Der von Dialogflow für Webhook-Anfragen initiierte Netzwerkverkehr wird über ein öffentliches Netzwerk gesendet. Dialogflow unterstützt optional die gegenseitige TLS-Authentifizierung (mTLS), um sicherzustellen, dass der Traffic in beide Richtungen sicher und vertrauenswürdig ist. Während des standardmäßigen TLS-Handshakes von Dialogflow stellt Ihr Webhook-Server ein Zertifikat zur Verfügung, das von Dialogflow entweder durch Befolgen der Zertifizierungsstellenkette oder durch Vergleich mit einem benutzerdefinierten CA-Zertifikat validiert werden kann. Wenn Sie mTLS auf Ihrem Webhook-Server aktivieren, kann das Google-Zertifikat, das von Dialogflow gegenüber Ihrem Webhook-Server zur Validierung bereitgestellt wird, authentifiziert werden. Dadurch wird der Aufbau des gegenseitigen Vertrauens abgeschlossen.
mTLS anfordern
So fordern Sie mTLS an:
- Sie konfigurieren Ihren Webhook-HTTPS-Server so, dass er während des TLS-Handshakes das Clientzertifikat anfordert.
- Der Webhook-Server sollte das Clientzertifikat beim Empfang bestätigen.
Sie installieren für den Webhook-Server eine Zertifikatskette, die sowohl vom Client als auch vom Server als vertrauenswürdig eingestuft werden kann. Anwendungen, die eine Verbindung zu Google-Diensten herstellen, sollten allen von Google Trust Services aufgeführten Zertifizierungsstellen vertrauen. Sie können Root-Zertifikate von https://pki.goog/ herunterladen.
Beispielaufruf an einen Webhook-Server mit mTLS
In diesem Beispiel wird der Agent aus der Kurzanleitung mit einem Webhook-Server verwendet, auf dem openssl
ausgeführt wird.
- Beispieleinrichtung
- Ein Dialogflow CX-Agent, der T-Shirt-Bestellungen entgegennimmt und an einen Webhook sendet, der auf einen eigenständigen Webserver verweist.
- Ein privater Schlüssel für die TLS-Kommunikation in einer Datei mit dem Namen
key.pem
. - Eine Zertifikatskette, die von einer öffentlich vertrauenswürdigen Zertifizierungsstelle in einer Datei namens
fullchain.pem
signiert wurde.
-
Führen Sie das
openssl s_server
-Programm auf dem Servercomputer aus.sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
- Eine Anfrage wird von einem Clientcomputer an den Agent gesendet. In diesem Beispiel lautet die Anfrage „Ich möchte ein rotes Hemd Größe L“. Diese Anfrage kann über die Dialogflow-Konsole oder über einen API-Aufruf gesendet werden.
-
Ausgabe von
openssl s_server
auf dem Servercomputer.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
Best Practice
Damit Webhook-Anfragen von Ihren eigenen Dialogflow-Agents initiiert werden, sollten Sie das Dienstidentitätstoken des Inhabers aus dem Autorisierungsheader der Anfrage verifizieren. Alternativ können Sie einen Sitzungsparameter überprüfen, der zuvor von einem Authentifizierungsserver auf Ihrer Seite bereitgestellt wurde.
Fehler
Wenn die Validierung des Clientzertifikats fehlschlägt (z. B. wenn der Webhook-Server dem Clientzertifikat nicht vertraut), schlägt der TLS-Handshake fehl und die Sitzung wird beendet.
Häufige Fehlermeldungen:
Fehlermeldung | Erklärung |
---|---|
Failed to verify client's certificate: x509: certificate signed by unknown authority | Dialogflow sendet das Clientzertifikat an den externen Webhook, der es jedoch nicht bestätigen kann. Das kann daran liegen, dass der externe Webhook die CA-Kette nicht korrekt installiert hat. Alle Stamm-CAs von Google sollten vertrauenswürdig sein. |