Autenticación TLS mutuo

El tráfico de red iniciado por Dialogflow para las solicitudes de webhook se envía en una red pública. Para asegurarse de que el tráfico sea seguro y de confianza en ambas direcciones, Dialogflow admite de forma opcional la autenticación TLS mutua (mTLS). Durante el handshake TLS estándar de Dialogflow, tu servidor webhook presenta un certificado que Dialogflow puede validar siguiendo la cadena de la autoridad de certificación o comparando el certificado con un certificado de AC personalizado. Si habilitas mTLS en tu servidor webhook, podrá autenticar el certificado de Google que presenta Dialogflow a tu servidor webhook para validarlo, lo que completará el establecimiento de la confianza mutua.

Solicitar mTLS

Para solicitar mTLS, sigue estos pasos:

  1. Prepara tu servidor HTTPS de webhook para solicitar el certificado de cliente durante la negociación de TLS.
  2. Tu servidor webhook debe verificar el certificado de cliente al recibirlo.
  3. Instala una cadena de certificados en tu servidor webhook, que puedan usar tanto el cliente como el servidor. Las aplicaciones que se conecten a los servicios de Google deben confiar en todas las autoridades de certificación que figuren en Google Trust Services. Puedes descargar certificados raíz desde: https://pki.goog/.

Llamada de ejemplo a un servidor webhook mediante mTLS

En este ejemplo se usa el agente que se muestra en la guía de inicio rápido con un servidor webhook que se ejecuta en openssl.

  1. Configuración de ejemplo
    1. Un agente de Dialogflow CX que recibe pedidos de camisetas y los envía a un webhook que apunta a un servidor web independiente.
    2. Una clave privada para la comunicación TLS en un archivo llamado key.pem.
    3. Una cadena de certificados firmada por una autoridad de certificación (CA) de confianza pública en un archivo llamado fullchain.pem.
  2. Ejecuta el programa openssl s_server en la máquina del servidor.
    sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
  3. Se envía una solicitud al agente desde un equipo cliente. En este ejemplo, la solicitud es "Quiero comprar una camiseta roja grande". Esta solicitud se puede enviar mediante la consola de Dialogflow o a través de una llamada a la API.
  4. Salida de openssl s_server en la máquina del 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

Los certificados de cliente personalizados se pueden configurar a nivel de agente para que los usen todos los webhooks. En el momento de la invocación del webhook, los certificados configurados se presentarán durante el handshake.

La clave privada y la frase de contraseña se configuran como un recurso de Secret Manager. El agente de servicio de Dialogflow deberá tener permisos de lector de recursos de Secret Manager para el secreto.

Los certificados de cliente deben estar firmados por una autoridad de certificación para que el handshake se realice correctamente.

Práctica recomendada

Para asegurarte de que las solicitudes de webhook se inician desde tus propios agentes de Dialogflow, debes verificar el token de identidad de servicio Bearer de la cabecera Authorization de la solicitud. También puedes verificar un parámetro de sesión que haya proporcionado previamente un servidor de autenticación de tu lado.

Errores

Si la validación del certificado de cliente falla (por ejemplo, si el servidor webhook no confía en el certificado de cliente), el handshake TLS falla y la sesión finaliza.

Mensajes de error habituales:

Mensaje de error Explicación
No se ha podido verificar el certificado del cliente: x509: certificado firmado por una autoridad desconocida Dialogflow envía su certificado de cliente al webhook externo, pero este no puede verificarlo. Esto puede deberse a que el webhook externo no haya instalado la cadena de CA correctamente. Todas las ACs raíz de Google deben ser de confianza.