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, seu servidor de webhook apresenta um certificado que pode ser validado pelo Dialogflow seguindo a cadeia de autoridades de certificação ou comparando o certificado a um certificado de CA personalizado. Ao ativar a mTLS no servidor de webhook, ele poderá autenticar o certificado do Google apresentado pelo Dialogflow no servidor de webhook para validação, concluindo o estabelecimento da 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

Neste exemplo, usamos o agente mostrado no guia de início rápido com um servidor webhook em execução openssl.

  1. Exemplo de configuração
    1. Um agente do Dialogflow CX que recebe os pedidos de camisetas e os envia para um webhook que aponta para um servidor da Web autônomo.
    2. Uma chave privada para comunicação TLS em um arquivo chamado key.pem.
    3. Uma cadeia de certificados assinada por uma CA (autoridade de certificação) confiável publicamente 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 é "Quero comprar uma camisa vermelha grande". 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: 0xEAEA:...
    Shared Elliptic groups: X25519:...
    CIPHER is TLS_AES_128_GCM_SHA256
    Secure Renegotiation IS NOT supported
    POST /shirts-agent-webhook HTTP/1.1
    authorization: Bearer ey...
    content-type: application/json
    Host: www.example.com
    Content-Length: 1595
    Connection: keep-alive
    Accept: */*
    User-Agent: Google-Dialogflow
    Accept-Encoding: gzip, deflate, br
    
    {
      "detectIntentResponseId": "a7951ce2-2f00-4af5-a508-4c2cb45698b0",
      "intentInfo": {
        "lastMatchedIntent": "projects/PROJECT_ID/locations/REGION/agents/AGENT_ID/intents/0adebb70-a727-4687-b8bc-fbbc2ac0b665",
        "parameters": {
          "color": {
            "originalValue": "red",
            "resolvedValue": "red"
          },
          "size": {
            "originalValue": "large",
            "resolvedValue": "large"
          }
        },
        "displayName": "order.new",
        "confidence": 0.9978873
      },
      "pageInfo": {
        "currentPage": "projects/PROJECT_ID/locations/REGION/agents/AGENT_ID/flows/00000000-0000-0000-0000-000000000000/pages/06e6fc4d-c2f2-4830-ab57-7a318f20fd90",
        "displayName": "Order Confirmation"
      },
      "sessionInfo": {
        "session": "projects/PROJECT_ID/locations/REGION/agents/AGENT_ID/sessions/session-test-001",
        "parameters": {
          "color": "red",
          "size": "large"
        }
      },
      "fulfillmentInfo": {
        "tag": "confirm"
      },
      "messages": [{
        "text": {
          "text": ["Ok, let\u0027s start a new order."],
          "redactedText": ["Ok, let\u0027s start a new order."]
        },
        "responseType": "ENTRY_PROMPT",
        "source": "VIRTUAL_AGENT"
      }, {
        "text": {
          "text": ["You have selected a large, red shirt."],
          "redactedText": ["You have selected a large, red shirt."]
        },
        "responseType": "HANDLER_PROMPT",
        "source": "VIRTUAL_AGENT"
      }],
      "text": "I want to buy a large red shirt",
      "languageCode": "en"
    }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 de serviço do portador do cabeçalho de autorização da solicitação. Como alternativa, você pode verificar um parâmetro de sessão fornecido anteriormente por um servidor de autenticação no 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.