Le trafic réseau amorcé par Dialogflow pour les requêtes de webhook est envoyé sur un réseau public. Pour garantir la sécurité et la fiabilité du trafic dans les deux sens, Dialogflow offre la possibilité d'utiliser l'authentification TLS mutuelle (mTLS). Lors de l'handshake TLS standard de Dialogflow, votre serveur de webhook présente un certificat qui peut être validé par Dialogflow, soit en suivant la chaîne d'autorité de certification, soit en comparant le certificat à un certificat d'autorité de certification personnalisée. En activant mTLS sur votre serveur de webhook, il pourra authentifier le certificat Google présenté par Dialogflow à votre serveur de webhook pour validation, ce qui établira la confiance mutuelle.
Demander l'authentification mTLS
Pour demander l'authentification mTLS, procédez comme suit :
- Préparez votre serveur HTTPS de webhook de sorte qu'il demande le certificat client lors du handshake TLS.
- Votre serveur de webhook doit valider le certificat client lors de sa réception.
- Installez une chaîne de certificats pour votre serveur de webhook. Ce certificat doit pouvoir être approuvé conjointement par le client et le serveur. Les applications se connectant aux services Google doivent approuver toutes les autorités de certification répertoriées par Google Trust Services. Vous pouvez télécharger les certificats racine à l'adresse suivante : https://pki.goog/.
Exemple d'appel à un serveur webhook à l'aide de mTLS
Cet exemple utilise l'agent présenté dans le guide de démarrage rapide avec un serveur webhook exécutant openssl
.
- Exemple de configuration
- Agent Dialogflow CX qui prend les commandes de chemises et les envoie à un webhook pointant vers un serveur Web autonome.
- Une clé privée pour la communication TLS dans un fichier nommé
key.pem
. - Chaîne de certificats signée par une autorité de certification (CA) approuvée publiquement dans un fichier nommé
fullchain.pem
.
-
Exécutez le programme
openssl s_server
sur la machine serveur.sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
- Une requête est envoyée à l'agent à partir d'une machine cliente. Dans cet exemple, la requête est "Je veux acheter une chemise rouge de grande taille". Cette requête peut être envoyée à l'aide de la console Dialogflow ou via un appel d'API.
-
Résultat de
openssl s_server
sur la machine serveur.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
Certificat client personnalisé
Les certificats client personnalisés peuvent être configurés au niveau de l'agent pour être utilisés par tous les webhooks. Au moment de l'appel du webhook, les certificats configurés sont présentés lors du handshake.
La clé privée et la phrase secrète sont configurées en tant que ressource Secret Manager. L'agent de service Dialogflow doit disposer des autorisations d'accès aux secrets Secret Manager pour le secret.
Les certificats client doivent être signés par une autorité de certification pour que l'échange de clés soit réussi.
Bonne pratique
Pour vous assurer que les requêtes de webhook sont lancées à partir de vos propres agents Dialogflow, vous devez vérifier le jeton d'identité de service Bearer dans l'en-tête d'autorisation de la requête. Vous pouvez également vérifier un paramètre de session fourni précédemment par un serveur d'authentification de votre côté.
Erreurs
Si la validation du certificat client échoue (par exemple, si le serveur de webhook ne fait pas confiance au certificat client), le handshake TLS échoue et la session se termine.
Messages d'erreur fréquents :
Message d'erreur | Explication |
---|---|
Échec de la validation du certificat du client : x509 : certificat signé par une autorité inconnue | Dialogflow envoie son certificat client au webhook externe, qui ne peut pas le valider. Cela est peut-être dû au fait que le webhook externe n'a pas correctement installé la chaîne d'autorité de certification. Toutes les autorités de certification racine de Google doivent être approuvées. |