Tengo una configuración simple y segura de origen cruzado en el mismo sitio como:
Interfaz:https://www.ejemplo.com API:https://api.ejemplo.com
En ambos dominios utilizamos certificados SSL emitidos por Amazon (AWS ACM)
Algunos de nuestros clientes tienen instalado Bit Defender Total Security, que bloquea las llamadas a nuestra propia API, incluso una GET
llamada simple que no implica ningún intercambio sofisticado de credenciales/cookies.
Descubrí que Bitdefender elimina el access-control-allow-origin
encabezado en la solicitud XHR real; la OPTIONS
llamada a la API todavía tiene el encabezado correcto.
Cuando desactivo la función "Protección web de Online Threat Prevention > Escaneo web cifrado" en Bitdefender y reinicie Chrome, funciona como se esperaba y la GET
llamada a la API vuelve correctamenteaccess-controll-allow-origin=https://www.example.com
El problema tampoco ocurre si la API está en el mismo dominio, como https://www.example.com/api
, lo que sugiere que este también es un comportamiento de Bitdefender relacionado con CORS.
Al leer la descripción de esta característica, pensé que tal vez a Bitdefender no le gustan nuestros certificados y reemplacé nuestros certificados de AWS con certificados de LetsEncrypt; ni siquiera un certificado comodín; Sigue siendo el mismo problema.
También noté que Bitdefender reemplaza nuestro certificado con su propio certificado local, para actuar como intermediario, probablemente para escanear las solicitudes, supongo.
Lo que no entiendo es que por ejemplowww.imdb.comtiene una configuración similar con suapi.graphql.imdb.comy también utilizan certificados AWS.
Pero por algunas razones, sus certificados no se reemplazan y su encabezado access-controll-allow-origin no se elimina en sus solicitudes de API.
Las únicas diferencias que pude detectar hasta ahora entre nosotros e IMDB es que ellos usanTLS 1.3en sus solicitudes y utilizamosTLS 1.2(a través de AWS API Gateway)
La ayuda en línea que encontré hasta ahora solo sugiere pedirle al cliente que cambie esa función en Bitdefender en su sitio, lo cual me resulta difícil de aceptar si este tipo de configuración funciona para IMDB (bueno, tal vez Bitdefender los incluya en la lista blanca).
También lo informé a Bitdefender como una identificación de hilo "falso positivo", pero no obtuve nada.
¿Alguna otra idea sobre lo que puedo buscar?
Respuesta1
El equipo de Bitdefender fue de gran ayuda. Resultó que cuando Bitdefender está activo baja ahttp/1.1protocolo. Nuestro servidor no devolvió el encabezado "Access-Control-Allow-Origin" para http/1 sino solo para http/2. Podría depurar esto fácilmente incluso sin Bitdefender usando curl con
--http1.1
la bandera activa o iniciando Chrome con --disable-http2
. Estamos usandoPuerta de enlace API de AWSen nuestra configuración y después de buscar un poco más en Google, descubrí que AWS está analizando los encabezados de solicitud ligeramente diferentes para http/1.
encabezados.ohrigin versus encabezados.ohorigen
Estamos usando el valor de origen para crear los encabezados de respuesta correctos y, como esperábamos minúsculas, básicamente no pudimos encontrar el valor. Sí, sólo una carta que me llevó días. Simplemente agregando este respaldo funcionó:
const origin = headers["origin"] || headers ["Origin"]
¡Gracias Bitdefender por la pista!