Autenticación mutua de TLS

El tráfico de red iniciado por Dialogflow para las solicitudes de webhook se envía en una red pública. Para garantizar que el tráfico sea seguro y confiable en ambas direcciones, Dialogflow admite como opción la autenticación mutua de TLS (mTLS). Con mTLS, el cliente (Dialogflow) y el servidor (tu servidor de webhook) presentan un certificado durante un protocolo de enlace TLS, que demuestra la identidad de forma mutua.

Solicitud de mTLS

Para solicitar una mTLS, sigue estos pasos:

  1. Prepara tu servidor HTTPS de webhook para que solicite el certificado de cliente durante el protocolo de enlace TLS.
  2. Tu servidor de webhook debe verificar el certificado de cliente cuando lo recibe.
  3. Instala una cadena de certificados para tu servidor de webhook, en el que el cliente y el servidor puedan confiar de forma mutua. Las aplicaciones que se conectan a los servicios de Google deben confiar en todas las autoridades certificadas que mencionan Google Trust Services. Puedes descargar certificados raíz desde https://pki.goog/.

Servidor Node.js de demostración

A continuación, se muestra un servidor Node.js de demostración:

  1. Prepara un certificado autofirmado y un archivo PEM.
  2. Prepara el archivo de cadena de certificados:
    curl https://pki.goog/roots.pem >> ca-crt.pem
        
  3. Guarda el ejemplo que se muestra a continuación como 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. Ejecuta server.js.
  5. Configura requestCert para que sea verdadero.
    curl https://127.0.0.1:4433 -k
        
  6. Envía el certificado de cliente. El protocolo de enlace SSL se completa con éxito.
    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
        

Práctica recomendada

Para asegurarte de que las solicitudes de webhook se inicien desde tus propios agentes de Dialogflow, debes verificar el ID del proyecto en los nombres de recursos de las solicitudes de webhook (por ejemplo, session) en el servidor de webhook.

Errores

Si la certificación del cliente falla (por ejemplo, si el cliente no envía un certificado de cliente o el certificado de cliente no se firmó de forma correcta), el protocolo TLS falla y la sesión finaliza.

Mensajes de error comunes:

Mensaje de error Explicación
No se pudo verificar el certificado de cliente: x509: certificado firmado por autoridad desconocida Dialogflow envía su certificado de cliente al webhook externo, pero el webhook externo no puede verificarlo. Esto puede deberse a que el webhook externo no instaló la cadena de CA de forma correcta. Todas las CA raíz de Google deben ser de confianza.