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 seu servidor de webhook, ele poderá autenticar o certificado do Google apresentado pelo Dialogflow ao servidor de webhook para validação, concluindo o estabelecimento de conexões confiança.

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 correndo openssl.

  1. Exemplo de configuração
    1. Um agente do Dialogflow CX que recebe pedidos de camisas e os envia para 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 um confiável publicamente Autoridade de certificação (AC) 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
          

Certificado do cliente personalizado

Os certificados do cliente personalizados podem ser configurados no nível do agente para serem usados por todos os webhooks. No momento da invocação do webhook, os certificados configurados serão apresentados durante o handshake.

A chave privada e a senha longa são configuradas como um Secret Manager recurso. O agente de serviço do Dialogflow precisa receber um secret Permissões do acessador de secrets do administrador para o secret.

Os certificados do cliente precisam ser assinados por uma autoridade certificadora para que a sessão seja bem-sucedida.

Prática recomendada

Para garantir que as solicitações de webhook sejam iniciadas pelos seus próprios agentes do Dialogflow, verifique o portador token de identidade do serviço 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, o servidor do webhook não confia no certificado do cliente) ocorre uma falha no handshake de TLS e a sessão é 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.