Autenticação TLS mútua

O tráfego de rede iniciado pelo Dialogflow para solicitações de webhook é enviado em uma rede pública. Para garantir que o tráfego seja seguro e confiável em ambas as direções, o Dialogflow é compatível com a autenticação TLS mútua (mTLS) (em inglês). Com o mTLS, o cliente (Dialogflow) e o servidor (seu servidor de webhook) apresentam um certificado durante um handshake de TLS (em inglês), que prova a identidade mutuamente.

Como solicitar mTLS

Para solicitar mTLS:

  1. Prepare o servidor HTTPS de webhook para solicitar o certificado do cliente durante o handshake de TLS.
  2. O servidor de webhook verifica o certificado do cliente ao recebê-lo.
  3. Instale uma cadeia de certificados para seu servidor de webhook. É possível que ele seja mutuamente confiável tanto pelo cliente quanto pelo servidor. Use o Google Trust Services CA 1O1 (GTS CA 1O1). O GTS CA 1O1 usa a raiz GlobalSign R2 (GS Root R2), que pertence ao Google Trust Services e é controlada por ele. Faça o download em: https://pki.goog/ (em inglês)

Servidor de demonstração do Node.js

Veja a seguir um servidor de demonstração do Node.js:

  1. Prepare um certificado autoassinado e um arquivo pem.
  2. Prepare o arquivo da cadeia 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. Salve o exemplo a seguir 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. Execute o server.js.
  5. Defina requestCert como "true".
    curl https://127.0.0.1:4433 -k
        
  6. Envie o certificado do cliente. O handshake de SSL é concluído com sucesso.
    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
        

Erros

Se a certificação do cliente falhar, por exemplo, nenhum certificado do cliente for enviado pelo cliente ou não estiver assinado corretamente, o handshake de TLS falhará e a sessão será encerrada.

Mensagens de erro comuns:

Mensagem de erro Explicação
Falha ao verificar o certificado do cliente: x509: certificado assinado por autoridade desconhecida O Dialogflow envia seu certificado de cliente para o webhook externo, mas o webhook não pode verificá-lo. Isso pode acontecer porque o webhook externo não instalou a cadeia de CA corretamente. A CA atual do Dialogflow é Google Trust Services CA 1O1. O GTS CA 1O1 usa a raiz GlobalSign R2, que é de propriedade do Google Trust Services e controlada por ele.