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). Durante o handshake de TLS padrão do Dialogflow, o servidor de webhook apresenta um certificado que pode ser validado pelo Dialogflow, seguindo a cadeia de autoridades certificadoras ou comparando o certificado a um certificado de AC personalizado. Ao ativar o mTLS no servidor de webhook, ele poderá autenticar o certificado do Google apresentado pelo Dialogflow para validação, concluindo o estabelecimento de confiança mútua.

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 de certificados raiz em: https://pki.goog/.

Exemplo de chamada para um servidor de webhook usando mTLS

Este exemplo usa o agente mostrado no início rápido com um servidor de webhook executando openssl.

  1. Exemplo de configuração
    1. Um agente do Dialogflow ES que cumprimenta o usuário final e consulta um webhook que aponta para um servidor da Web independente.
    2. Uma chave privada para comunicação TLS em um arquivo chamado key.pem.
    3. Uma cadeia de certificados assinada por uma autoridade de certificação publicamente confiável (CA) em um arquivo chamado fullchain.pem.
  2. Execute o programa openssl s_server na máquina do servidor.
    sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
  3. Uma solicitação é enviada ao agente de uma máquina cliente. Neste exemplo, a solicitação é "Olá". Essa solicitação pode ser enviada usando o console do Dialogflow ou por uma chamada de API.
  4. Saída de openssl s_server na máquina do servidor.
    verify depth is 1
    Using default temp DH parameters
    ACCEPT
    depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1
    verify return:1
    depth=1 C = US, O = Google Trust Services LLC, CN = GTS CA 1D4
    verify return:1
    depth=0 CN = *.dialogflow.com
    verify return:1
    -----BEGIN SSL SESSION PARAMETERS-----
    MII...
    -----END SSL SESSION PARAMETERS-----
    Client certificate
    -----BEGIN CERTIFICATE-----
    MII...
    -----END CERTIFICATE-----
    subject=CN = *.dialogflow.com
    
    issuer=C = US, O = Google Trust Services LLC, CN = GTS CA 1D4
    
    Shared ciphers:TLS_AES_128_GCM_SHA256:...
    Signature Algorithms: ECDSA+SHA256:...
    Shared Signature Algorithms: ECDSA+SHA256:...
    Peer signing digest: SHA256
    Peer signature type: RSA-PSS
    Supported Elliptic Groups: 0x6A6A:...
    Shared Elliptic groups: X25519:...
    CIPHER is TLS_AES_128_GCM_SHA256
    Secure Renegotiation IS NOT supported
    POST /dialogflowFulfillment HTTP/1.1
    authorization: Bearer ey...
    content-type: application/json
    Host: www.example.com
    Content-Length: 1011
    Connection: keep-alive
    Accept: */*
    User-Agent: Google-Dialogflow
    Accept-Encoding: gzip, deflate, br
    
    {
      "responseId": "96c0029a-149d-4f5d-b225-0b0bb0f0c8d9-afbcf665",
      "queryResult": {
        "queryText": "Hi",
        "action": "input.welcome",
        "parameters": {
        },
        "allRequiredParamsPresent": true,
        "outputContexts": [{
          "name": "projects/PROJECT-ID/agent/sessions/58ab33f3-b57a-aae9-fb23-8306242d4871/contexts/__system_counters__",
          "parameters": {
            "no-input": 0.0,
            "no-match": 0.0
          }
        }],
        "intent": {
          "name": "projects/PROJECT-ID/agent/intents/399277d6-2ed7-4329-840d-8baa0f60480e",
          "displayName": "Default Welcome Intent"
        },
        "intentDetectionConfidence": 1.0,
        "languageCode": "en",
        "sentimentAnalysisResult": {
          "queryTextSentiment": {
            "score": 0.2,
            "magnitude": 0.2
          }
        }
      },
      "originalDetectIntentRequest": {
        "source": "DIALOGFLOW_CONSOLE",
        "payload": {
        }
      },
      "session": "projects/PROJECT-ID/agent/sessions/58ab33f3-b57a-aae9-fb23-8306242d4871"
    }ERROR
    shutting down SSL
    CONNECTION CLOSED
          

Prática recomendada

Para garantir que as solicitações de webhook sejam iniciadas pelos seus próprios agentes do Dialogflow, verifique o token de identidade do serviço do Bearer no cabeçalho de autorização da solicitação. Como alternativa, é possível verificar um parâmetro de sessão fornecido anteriormente por um servidor de autenticação do seu lado.

Erros

Se a validação do certificado do cliente falhar, por exemplo, se o servidor de webhook não confiar no certificado do cliente, 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 são confiáveis.