Authentification TLS mutuelle

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). Au cours du handshake TLS standard de Dialogflow, votre serveur de webhook présente un certificat qui peut être validé par Dialogflow, en suivant la chaîne d'autorité de certification ou en le comparant à un certificat CA personnalisé. En activant mTLS sur votre serveur de webhook, il pourra s'authentifier Le certificat Google présenté par Dialogflow à votre serveur de webhooks pour validation, ce qui permet de terminer la mise en place de la confiance.

Demander l'authentification mTLS

Pour demander l'authentification mTLS, procédez comme suit :

  1. Préparez votre serveur HTTPS de webhook de sorte qu'il demande le certificat client lors du handshake TLS.
  2. Votre serveur de webhook doit valider le certificat client lors de sa réception.
  3. 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 vers un serveur de webhook à l'aide de mTLS

Cet exemple utilise l'agent présenté dans le guide de démarrage rapide avec une Serveur webhook en cours d'exécution openssl

  1. Exemple de configuration <ph type="x-smartling-placeholder">
      </ph>
    1. Un agent Dialogflow CX qui prend les commandes de chemises et les envoie pointant vers un serveur Web autonome.
    2. Une clé privée pour la communication TLS dans un fichier nommé key.pem
    3. Une chaîne de certificats signée par un publiquement approuvée CA (autorité de certification) dans un fichier nommé fullchain.pem.
  2. 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
  3. Une requête est envoyée à l'agent à partir d'une machine cliente. Dans cet exemple, la requête est "Je veux acheter une grande chemise rouge." Cette demande peut être envoyée à l'aide du la console Dialogflow ou un appel d'API.
  4. Sortie 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
          

Bonne pratique

Pour vous assurer que les requêtes de webhook sont lancées à partir de vos propres agents Dialogflow, vérifiez que le support jeton d'identité de service à partir de l'en-tête "Authorization" de la requête. Vous pouvez également valider une session fourni précédemment par un serveur d'authentification de votre côté.

Erreurs

Si la validation du certificat client échoue (par exemple, le serveur de webhook n'approuve pas le 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.