Autenticação TLS mútua

O tráfego de rede iniciado pelo Dialogflow para pedidos de webhook é enviado numa rede pública. Para garantir que o tráfego é seguro e fidedigno em ambas as direções, o Dialogflow suporta opcionalmente a autenticação TLS mútua (mTLS). Durante o handshake TLS padrão do Dialogflow, o servidor do webhook apresenta um certificado que pode ser validado pelo Dialogflow, seguindo a cadeia de autoridades de certificação ou comparando o certificado com um certificado de AC personalizado. Ao ativar o mTLS no servidor de webhook, este vai poder autenticar o certificado da Google apresentado pelo Dialogflow ao servidor de webhook para validação, concluindo o estabelecimento de confiança mútua.

Pedir mTLS

Para pedir mTLS:

  1. Prepare o servidor HTTPS do webhook para pedir o certificado de cliente durante o handshake TLS.
  2. O servidor do webhook deve validar o certificado do cliente após a receção.
  3. Instale uma cadeia de certificados para o seu servidor de webhook, que pode ser mutuamente fidedigna tanto para o cliente como para o servidor. As aplicações que se ligam aos serviços Google devem confiar em todas as autoridades de certificação indicadas pelos serviços de confiança da Google. Pode transferir certificados de raiz a partir de: https://pki.goog/.

Exemplo de chamada para um servidor de webhook através do mTLS

Este exemplo usa o agente apresentado no início rápido com um servidor de webhook em execução em openssl.

  1. Configuração de exemplo
    1. Um agente do Dialogflow CX que recebe encomendas de camisas e as envia para um webhook que aponta para um servidor Web autónomo.
    2. Uma chave privada para comunicação TLS num ficheiro denominado key.pem.
    3. Uma cadeia de certificados assinada por uma CA (autoridade de certificação) fidedigna publicamente num ficheiro denominado 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. É enviado um pedido ao agente a partir de um computador cliente. Para este exemplo, o pedido é: "Quero comprar uma camisola vermelha grande". Este pedido pode ser enviado através da consola do Dialogflow ou de uma chamada API.
  4. Resultado 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 de cliente personalizado

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

A chave privada e a frase de acesso estão configuradas como um recurso do Secret Manager. O agente de serviço do Dialogflow tem de receber autorizações de Secret Accessor do Secret Manager para o segredo.

Os certificados de cliente têm de ser assinados por uma autoridade de certificação para que a negociação seja bem-sucedida.

Prática recomendada

Para garantir que os pedidos de webhook são iniciados pelos seus próprios agentes do Dialogflow, deve validar o token de identidade do serviço do portador no cabeçalho de autorização do pedido. Em alternativa, pode validar 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 confiar no certificado do cliente), a negociação TLS falha e a sessão termina.

Mensagens de erro comuns:

Mensagem de erro Explicação
Falha ao validar o certificado do cliente: x509: certificate signed by unknown authority O Dialogflow envia o respetivo certificado de cliente para o webhook externo, mas o webhook externo não o consegue validar. Isto pode dever-se ao facto de o webhook externo não ter instalado corretamente a cadeia de AC. Todas as ACs de raiz da Google devem ser fidedignas.