Solucionar errores de validación de suscripción a Azure Event Grid

Cuando creas una suscripción a un evento de Event Grid para un endpoint webhook, Event Grid debe confirmar que eres el propietario del endpoint antes de que entregue eventos. Si ese apretón de manos de validación no se completa, la creación de la suscripción falla. Este artículo te ayuda a identificar por qué falla el apretón de manos y cómo solucionarlo.

Síntomas

Cuando creas una suscripción a un evento, ves un mensaje de error similar al siguiente texto:

The attempt to validate the provided endpoint https://your-endpoint-here failed. For more details, visit https://aka.ms/esvalidation

El error indica que Event Grid no pudo completar el handshake de validación con tu endpoint webhook, por lo que Event Grid no crea la suscripción.

Cause

Event Grid requiere que demuestres la propiedad de un endpoint webhook antes de que empiece a entregar eventos. Este requisito evita que un usuario malicioso inunde un endpoint con eventos. El error de validación aparece cuando el handshake entre Event Grid y tu endpoint no tiene éxito. Entre las causas comunes se incluyen las siguientes:

  • Tu punto de conexión no devuelve el código de validación para el intercambio inicial síncrono ni devuelve 200 OK para el intercambio inicial asíncrono (manual).
  • Un cortafuegos, Azure Application Gateway o un firewall de aplicaciones web (WAF) delante de tu endpoint bloquean la solicitud de validación y devuelve 403 (Forbidden).
  • Tu endpoint utiliza el esquema CloudEvents v1.0 pero no responde a la solicitud de validación HTTP OPTIONS .
  • Tu endpoint utiliza un certificado auto-firmado, que Event Grid no soporta para validación.

Para una descripción completa del handshake de validación, véase Validación de endpoint con esquema de eventos de Event Grid y validación de endpoint usando el esquema CloudEvents.

Solución 1: Probar el proceso de validación de una suscripción con esquema de Event Grid

Envía un ejemplo de SubscriptionValidationEvent a tu webhook y confirma la respuesta:

  1. Envía una solicitud HTTP POST a la URL de tu webhook con un cuerpo de solicitud de ejemplo SubscriptionValidationEvent usando curl o una herramienta similar.
  2. Si tu webhook implementa el intercambio inicial síncrono, verifica que devuelva validationCode en la respuesta. Debes devolver un código de estado HTTP 200 OK. La Cuadrícula de Eventos no reconoce HTTP 202 Accepted como respuesta válida y la solicitud debe completarse en 30 segundos.
  3. Si tu webhook implementa el handshake asincrónico (manual), verifica que tu endpoint devuelva 200 OK. Luego completa el handshake enviando una solicitud GET a los validationUrl datos del evento en un plazo de 10 minutos. La URL de validación usa el puerto 553, así que actualiza las reglas del firewall si ese puerto está bloqueado.

Aquí tienes un ejemplo SubscriptionValidationEvent de carga útil JSON que puedes enviar:

[
  {
    "id": "aaaa0000-bb11-2222-33cc-444444dddddd",
    "topic": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "subject": "",
    "data": {
      "validationCode": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
    },
    "eventType": "Microsoft.EventGrid.SubscriptionValidationEvent",
    "eventTime": "2018-01-25T22:12:19.4556811Z",
    "metadataVersion": "1",
    "dataVersion": "1"
  }
]

Esta es la respuesta esperada y exitosa:

{
  "validationResponse": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
}

Aquí tienes el comando curl equivalente para validar una suscripción de webhook que utiliza el esquema de eventos de Event Grid:

curl -X POST -d '[{"id": "aaaa0000-bb11-2222-33cc-444444dddddd","topic": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","subject": "","data": {"validationCode": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"},"eventType": "Microsoft.EventGrid.SubscriptionValidationEvent","eventTime": "2018-01-25T22:12:19.4556811Z", "metadataVersion": "1","dataVersion": "1"}]' -H 'Content-Type: application/json' https://{your-webhook-url.com}

Para saber más, consulte Validación de endpoint con esquema de eventos de la Grid de Eventos.

Solución 2: Eliminar las reglas de firewall o WAF que bloquean la solicitud de validación

Si tu webhook devuelve 403 (Forbidden), comprueba si está detrás de Azure Application Gateway o de un firewall de aplicaciones web. Si es así, desactiva las siguientes reglas del firewall y vuelve a hacer el HTTP POST:

  • 920300 (falta un encabezado de aceptación en la solicitud)
  • 942430 (Detección restringida de anomalías de caracteres SQL (args): número de caracteres especiales superado (12))
  • 920230 (varias codificaciones de direcciones URL detectadas)
  • 942130 (ataque de inyección SQL: detectada tautología SQL)
  • 931130 (Posible ataque remoto de inclusión de archivos (RFI): referencia o enlace fuera del dominio)

Solución 3: Validar una suscripción a un esquema de CloudEvents

Si tu suscripción utiliza el esquema CloudEvents v1.0, Event Grid utiliza protección contra abusos de CloudEvents en lugar del evento de validación de suscripción. Tu extremo debe responder al método HTTP OPTIONS y devolver la cabecera WebHook-Allowed-Origin. Para saber más, consulta Validación de endpoint usando el esquema CloudEvents.

Si necesitas más ayuda, haz tu pregunta en la página de preguntas y respuestas de Microsoft para Event Grid o abre un ticket de soporte.