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 :
- 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/.
Serveur Node.js de démonstration
Voici comment définir un serveur Node.js de démonstration :
- Préparez un certificat autosigné et un fichier .PEM.
- Préparez le fichier de chaîne de certificats :
curl https://pki.goog/roots.pem >> ca-crt.pem
- 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); });
- Exécutez server.js.
- Définissez requestCert sur "true".
curl https://127.0.0.1:4433 -k
-
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 de webhook sont lancées à partir de vos propres agents Dialogflow, vous devez vérifier l'ID de projet dans les noms de ressources des requêtes de 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. |