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. Os aplicativos que se conectam aos serviços do Google precisam confiar em todas as autoridades de certificação listadas nos Serviços de confiança do Google. Faça o download dos certificados raiz 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/roots.pem >> 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
        

Prática recomendada

Para garantir que as solicitações de webhook sejam iniciadas por seus próprios agentes do Dialogflow, verifique o ID do projeto nos nomes dos recursos das solicitações de webhook (por exemplo, session) no servidor de webhook.

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. Todas as CAs raiz do Google serão confiáveis.