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, su servidor de webhook presenta un certificado que Dialogflow puede validar siguiendo la cadena de la autoridad certificadora o comparando el certificado con un certificado de la AC personalizado. Si habilita mTLS en su servidor de webhook, podrá autenticarse el certificado de Google que presenta Dialogflow al servidor de webhook para la validación, lo que permite establecer confianza.
Solicita mTLS
Para solicitar una mTLS, sigue estos pasos:
- Prepara tu servidor HTTPS de webhook para que solicite el certificado de cliente durante el protocolo de enlace TLS.
- Tu servidor de webhook debe verificar el certificado de cliente cuando lo recibe.
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/.
Ejemplo de llamada a un servidor de webhook con mTLS
En este ejemplo, se usa el agente que se muestra en la guía de inicio rápido con un servidor webhook que ejecuta openssl
.
- Configuración de muestra
- Un agente de Dialogflow ES que saluda al usuario final y hace una consulta webhook que apunta a un servidor web independiente.
- Una clave privada para la comunicación TLS en un archivo llamado
key.pem
- Una cadena de certificados firmada por un
de confianza pública
CA (autoridad certificadora) en un archivo llamado
fullchain.pem
.
-
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
- Se envía una solicitud al agente desde una máquina cliente. Para este ejemplo, la solicitud está "Hola". Esta solicitud se puede enviar con la consola de Dialogflow o a través de una llamada a la API.
-
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: 0x6A6A:... Shared Elliptic groups: X25519:... CIPHER is TLS_AES_128_GCM_SHA256 Secure Renegotiation IS NOT supported POST /dialogflowFulfillment HTTP/1.1 authorization: Bearer ey... content-type: application/json Host: www.example.com Content-Length: 1011 Connection: keep-alive Accept: */* User-Agent: Google-Dialogflow Accept-Encoding: gzip, deflate, br { "responseId": "96c0029a-149d-4f5d-b225-0b0bb0f0c8d9-afbcf665", "queryResult": { "queryText": "Hi", "action": "input.welcome", "parameters": { }, "allRequiredParamsPresent": true, "outputContexts": [{ "name": "projects/PROJECT-ID/agent/sessions/58ab33f3-b57a-aae9-fb23-8306242d4871/contexts/__system_counters__", "parameters": { "no-input": 0.0, "no-match": 0.0 } }], "intent": { "name": "projects/PROJECT-ID/agent/intents/399277d6-2ed7-4329-840d-8baa0f60480e", "displayName": "Default Welcome Intent" }, "intentDetectionConfidence": 1.0, "languageCode": "en", "sentimentAnalysisResult": { "queryTextSentiment": { "score": 0.2, "magnitude": 0.2 } } }, "originalDetectIntentRequest": { "source": "DIALOGFLOW_CONSOLE", "payload": { } }, "session": "projects/PROJECT-ID/agent/sessions/58ab33f3-b57a-aae9-fb23-8306242d4871" }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 del servicio de Bearer en el encabezado de autorización de la solicitud. Como alternativa, puedes verificar un parámetro de sesión que proporcionó previamente un servidor de autenticación de tu parte.
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. |