У меня простая безопасная настройка на одном сайте и в разных источниках:
Внешний интерфейс:https://www.example.com API-интерфейс:https://api.example.com
На обоих доменах мы используем SSL-сертификаты, выданные Amazon (AWS ACM)
У некоторых наших клиентов установлен Bit Defender Total Security, который блокирует вызовы API к нашему собственному API, даже простые GET
вызовы, не требующие сложного обмена учетными данными/cookie-файлами.
Я обнаружил, что Bitdefender удаляет access-control-allow-origin
заголовок в самом запросе XHR; OPTIONS
вызов API по-прежнему имеет правильный заголовок.
Когда я отключаю функцию "Защита Интернет-угроз от Интернет-предотвращения > Зашифрованное веб-сканирование"в Bitdefender и перезапустите Chrome, он работает как и ожидалось, и GET
вызов API возвращается правильноaccess-controll-allow-origin=https://www.example.com
Проблема также не возникает, если API находится в том же домене, например https://www.example.com/api
, , что говорит о том, что это также поведение Bitdefender, связанное с CORS.
Прочитав описание этой функции, я подумал, что, возможно, Bitdefender не нравятся наши сертификаты, и я заменил наши сертификаты AWS на сертификаты LetsEncrypt; даже не подстановочный сертификат; проблема все та же.
Я также заметил, что Bitdefender заменяет наш сертификат своим собственным локальным сертификатом, выступая в роли посредника, вероятно, для сканирования запросов, как я полагаю.
Чего я не понимаю, так это того, что, например,www.imdb.comимеет похожую установку с ихapi.graphql.imdb.comи они также используют сертификаты AWS.
Но по каким-то причинам их сертификаты не заменяются, а заголовок access-controll-allow-origin не удаляется в запросах API.
Единственное различие, которое я смог заметить между нами и IMDB, заключается в том, что они используютТЛС 1.3в своих запросах и мы используемТЛС 1.2(через шлюз AWS API)
Онлайн-помощь, которую я нашел на данный момент, предлагает только попросить клиента отключить эту функцию в Bitdefender на их сайте, что мне трудно принять, если такая настройка работает для IMDB (ну, может быть, они внесены в белый список Bitdefender).
Я также сообщил об этом в Bitdefender как о «ложном срабатывании» идентификации потока, но ответа не получил.
Есть ли еще идеи, что мне можно поискать?
решение1
Команда Bitdefender была очень полезна. Оказалось, что когда Bitdefender активен, он понижается доhttp/1.1протокол. Наш сервер не вернул заголовок "Access-Control-Allow-Origin" для http/1, а только для http/2. Я мог бы легко отладить это даже без Bitdefender, используя curl с
--http1.1
активным флагом или запустив Chrome с --disable-http2
. Мы используемAWS API-шлюзв нашей настройке и после некоторого гугления я обнаружил, что AWS анализирует заголовки запроса немного по-другому для http/1.
заголовки.Оrigin против заголовков.опроисхождение
Мы используем исходное значение для создания правильных заголовков ответа, и поскольку мы ожидали строчные буквы, мы в основном не смогли найти значение. Да, всего одна буква, на что у меня ушло несколько дней. Просто добавив этот резервный вариант, это сработало:
const origin = headers["origin"] || headers ["Origin"]
Спасибо Bitdefender за подсказку!