Firefox не будет выполнять запрос CORS на http://127.0.0.1 со страницы, обслуживаемой через https… - PullRequest
1 голос
/ 05 июля 2019

Мне нужно, чтобы веб-приложение связывалось с программой, запущенной на компьютере конечного пользователя.

Веб-приложение требует аутентификации и обслуживается по протоколу https.

Программа работает наКомпьютер конечного пользователя включает в себя http-сервер, который прослушивает 127.0.0.1:12345.

Чтобы отправить данные из веб-приложения в программу, я выполняю запрос PUT, используя Fetch API.Это должен быть запрос CORS, поскольку PUT не разрешен для запроса не-CORS.(Запрос POST будет разрешен для запроса не-CORS, но я не смогу указать правильный Content-Type…)

Все это прекрасно работает с Chromium (версия 73), но не работает с Firefox(пробовал с версиями 60 и 67, запрос вообще не отправлялся, даже запрос CORS-preflight).

После некоторого исследования кажется, что он работает нормально, когда страница обслуживается по http, но не когдаон подается через https.Насколько я понимаю, похоже, что это связано со спецификацией, которая гласит:

[…] агентам пользователей разрешено завершать алгоритм и не делать запрос.Это может быть сделано, потому что, например:

  • […]
  • https для http не разрешен.

Есть ли способ работатьобойти это и позволить Firefox выполнять CORS-запросы к 127.0.0.1 через http, даже со страницы https?

Насколько я понимаю, поскольку запрос отправляется на localhost (127.0.0.1), http не так уж многоменее безопасный, чем https.Запуск веб-приложения через http, а не через https будет работать, но это не вариант.Наличие сертификата TLS для localhost, установленного на компьютере конечного пользователя, для запуска сервера https в программе, которая запускается на компьютере конечного пользователя, на самом деле тоже не вариант…

РЕДАКТИРОВАТЬ: веб-приложение пытается получить доступ к http://127.0.0.1/12345,, а не http://localhost:12345, как я уже писал ранее.

Согласно примечанию в конце MDN Web Doc осмешанный контент , Firefox должен разрешать смешанный контент от http://127.0.0.1.

1 Ответ

1 голос
/ 05 июля 2019

Я думаю, что нет прямого способа сделать это, то есть принудительно заставить страницу загружаться в HTTPS для извлечения контента с HTTP-сервера.Смешанный контент определенно не нужен, а реализация Firefox несколько «более безопасна».Хотя есть несколько альтернатив, о которых я могу подумать.

Первый запуск HTTPS-сервера - это еще не все, «не вариант», вам не нужно создавать CA и устанавливать TLS и все такое.Вы можете просто купить реальный домен myapp.com, настроить поддомен, такой как loopback.myapp.com, настроить его на 127.0.0.1 (CloudFlare позволяет вам делать DNS бесплатно), купить реальный сертификат для этого субдомена, распространять частныйи открытый ключ в этом локальном комплекте приложений и запуск HTTPS-сервера. *

Другой подход заключается в расширении локального приложения в качестве прокси-сервера, который работает по адресу localhost: 8000, и прозрачной связи с удаленным веб-приложением.через HTTPS.Но, конечно, это зависит от того, что ваше веб-приложение не кодирует доменное имя жестко.

* Это теоретически может открыть дыру в безопасности: злоумышленник может выполнить спуфинг DNS и разрешить loopback.myapp.com жертвы распознавать на компьютере злоумышленника, итак как у каждого есть ключ, злоумышленник также сможет его расшифровать.Вы можете уменьшить это путем жесткого кодирования loopback.myapp.com до 127.0.0.1 в / etc / hosts

...