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). Avec le protocole mTLS, le client (Dialogflow) et le serveur (votre serveur de webhook) présentent un certificat au cours d'un handshake TLS de façon à se prouver mutuellement leur identité.

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 qui se connectent aux services Google doivent approuver toutes les autorités de certification répertoriées par Google Trust Services. Vous pouvez télécharger des certificats racines à l'adresse suivante : https://pki.goog/.

Serveur Node.js de démonstration

Voici comment définir un serveur Node.js de démonstration :

  1. Préparez un certificat autosigné et un fichier .PEM.
  2. Préparez le fichier de chaîne de certificats :
    curl https://pki.goog/roots.pem >> ca-crt.pem
        
  3. Enregistrez l'exemple suivant sous le nom server.js :
    var https = require('https');
    const express = require('express')
    var fs = require('fs');
    var options = {
      // Specify the key file for the server
      key: fs.readFileSync('./server-key.pem'),
      // Specify the certificate file
      cert: fs.readFileSync('./server-crt.pem'),
      // Specify the Certificate Authority certificate
      ca: fs.readFileSync('./ca-crt.pem'),
      // Requesting the client to provide a certificate, to authenticate the user.
      requestCert: true,
      // As specified as "true", so no unauthenticated traffic
      // will make it to the specified route specified
      rejectUnauthorized: false
    };
    
    var app = express();
    app.use(function (req, res, next) {
      if (!req.client.authorized) {
        //return res.status(401).send('Client cert failed. User is not authorized\n');
      }
      // Examine the cert itself, and even validate based on that!
      var cert = req.socket.getPeerCertificate();
      if (cert.subject) {
        console.log('Client Certificate: ',cert);
        console.log('Client Certificate Common Name: '+cert.subject.CN);
        console.log('Client Certificate Location: '+cert.subject.L);
        console.log('Client Certificate Organization Name: '+cert.subject.O);
        console.log('Client Certificate Email Address: '+cert.subject.emailAddress);
      }
    
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end("hello world from client cert\n");
      next();
    });
    var listener = https.createServer(options, app).listen(4433, function () {
      console.log('Express HTTPS server listening on port ' + listener.address().port);
    });
         
  4. Exécutez server.js.
  5. Définissez requestCert sur "true".
    curl https://127.0.0.1:4433 -k
        
  6. Envoyez le certificat client. Le handshake SSL est terminé.
    curl -v -s -k --key client-key.pem --cert client-crt.pem https://localhost:4433
    openssl s_client -key client-key.pem -cert client-crt.pem -connect localhost:4433 -CAfile ca-crt.pem
        

Bonne pratique

Pour vous assurer que les requêtes webhook sont lancées à partir de vos propres agents Dialogflow, vous devez valider l'ID de projet dans les noms de ressources des requêtes webhook (par exemple, session) sur votre serveur de webhook.

Erreurs

En cas d'échec de la certification client (par exemple, si aucun certificat client n'est envoyé par le client ou si le certificat client n'est pas signé correctement), 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.