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. Vous devez utiliser Google Trust Services CA 1O1 (GTS CA 1O1). GTS CA 1O1 utilise la racine GlobalSign R2 (GS Root R2), qui est détenue et contrôlée par Google Trust Services. Vous pouvez la télécharger sur 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/gsr2/GTS1O1.crt | openssl x509 -inform der >> ca-crt.pem
    curl https://pki.goog/gsr2/GSR2.crt | openssl x509 -inform der >> 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
        

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. L'autorité de certification actuelle de Dialogflow est Google Trust Services CA 1O1. GTS CA 1O1 utilise la racine GlobalSign R2, qui est détenue et contrôlée par Google Trust Services.