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 también admite 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.

Solicita 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. Debes usar la CA 1O1 de Google Trust Services (GTS CA 1O1). GTS CA 1O1 usa el certificado raíz de GlobalSign R2 (GS Root R2), que es propiedad de Google Trust Services y está bajo su control. Puedes descargarlo 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/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. 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
            

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 de enlace TLS falla y la sesión finaliza.

Mensajes de error más habituales:

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. La CA actual de Dialogflow es la CA 1O1 de Google Trust Services. GTS CA 1O1 usa el certificado raíz de GlobalSign R2, que es propiedad de Google Trust Services y está bajo su control.