Autenticación mutua de TLS

El tráfico de red iniciado por Dialogflow para las solicitudes de webhook se envía en una red pública. Para garantizar que el tráfico sea seguro y confiable en ambas direcciones, Dialogflow admite como opción la autenticación mutua de TLS (mTLS). Durante el protocolo de enlace TLS estándar de Dialogflow, tu servidor de webhook presenta un certificado que Dialogflow puede validar, ya sea mediante la cadena de la autoridad certificadora o mediante la comparación del certificado con un certificado de CA personalizado. Si habilitas mTLS en tu servidor de webhook, esta podrá autenticar el certificado de Google que presentó Dialogflow a tu servidor de webhook para su validación, lo que completará el establecimiento de la confianza mutua.

Solicitud de mTLS

Para solicitar una mTLS, sigue estos pasos:

  1. Prepara tu servidor HTTPS de webhook para que solicite el certificado de cliente durante el protocolo de enlace TLS.
  2. Tu servidor de webhook debe verificar el certificado de cliente cuando lo recibe.
  3. Instala una cadena de certificados para tu servidor de webhook, en el que el cliente y el servidor puedan confiar de forma mutua. Las aplicaciones que se conectan a los servicios de Google deben confiar en todas las autoridades certificadoras que se enumeran en los Google Trust Services. Puedes descargar certificados raíz desde https://pki.goog/.

Llamada de muestra a un servidor de webhook mediante mTLS

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

  1. Configuración de ejemplo
    1. Un agente de Dialogflow CX que toma 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 CA (autoridad certificada) 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 una máquina cliente. Para este ejemplo, la solicitud es "Quiero comprar una camisa roja grande". Esta solicitud se puede enviar mediante la consola de Dialogflow o una llamada a la API.
  4. Resultado 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
          

Práctica recomendada

Para asegurarte de que las solicitudes de webhook se inicien desde tus propios agentes de Dialogflow, debes verificar el token de identidad de servicio del portador del encabezado de la autorización de la solicitud. Como alternativa, puedes verificar un parámetro de sesión que un servidor de autenticación proporcionó antes en tu lado.

Errores

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

Mensajes de error comunes:

Mensaje de error Explicación
No se pudo verificar el certificado de cliente: x509: certificado firmado por autoridad desconocida Dialogflow envía su certificado de cliente al webhook externo, pero el webhook externo no puede verificarlo. Esto puede deberse a que el webhook externo no instaló la cadena de CA de forma correcta. Todas las CA raíz de Google son de confianza.