2016-11-17 3 views
4

У меня есть сайт с двумя серверами https. Один (frontend) обслуживает пользовательский интерфейс, созданный из статических страниц. Другой (backend) обслуживает микросервис. Оба они используют тот же (тестовый) сертификат X509, чтобы идентифицировать себя. В индивидуальном порядке я могу подключиться к ним как по https, требующим сертификата клиента «тестер».CORS с клиентскими сертификатами https

Мы скрывали проблемы CORS до сих пор, перейдя через установку nginx, которая делает внешний интерфейс и бэкэнд, что они являются одним и тем же Origin. Я применил «Access-Control-Allow-Origin» заголовков, «Access-Control-Allow-Credentials» для всех запросов; с методами, заголовками для запросов проверки перед полетом (ОПЦИИ).

  • В Chrome кросс-сайт, подобный этому, отлично работает. Я вижу, что интерфейсные URL-адреса и URL-адреса бэкэнд - это разные сайты. Я вижу, что запросы OPTIONS делаются до того, как будут сделаны запросы на бэкэнд.

  • Несмотря на то, что Chrome, похоже, не нуждается в этом, я нашел объект xmlhttprequest, который будет использоваться для выполнения запроса, и сделал на нем xhr.withCredentials = true, потому что это похоже на то, что fetch.js делает под капотом когда он получает "credentials":"include". Я заметил, что есть функция xhr.setRequestHeader, которую мне может понадобиться, чтобы сделать Firefox счастливым.

    • Firefox ведет себя одинаково для вызовов пользовательского интерфейса. Но для всех бэкэнд-звонков я получаю 405. Когда он делает это, на сервер не производится подключение к сети. Браузер просто решил, что это 405 без выполнения какого-либо запроса https. Несмотря на то, что это отличается от Chrome, это имеет смысл. И интерфейсный интерфейс интерфейса, и внутренний сервер необходимо выбрать сертификат клиента. Когда я подключился к пользовательскому интерфейсу, я выбрал сертификат «тестер». Когда он делает запрос на бэкэнд, он может предположить, что для доступа к внутреннему контенту должен использоваться тот же сертификат клиента. Но, возможно, он предполагает, что он может быть другим, и есть что-то еще, что я должен сказать Firefox.

Кто-нибудь здесь, используя CORS в сочетании с 2 пути SSL сертификаты, как это и имел эту проблему Firefox и фиксировали его где-нибудь. Я подозреваю, что это не проблема на стороне сервера, а что-то, что нужно сделать клиенту.

+0

Вы тестировали в Safari? Край? Было бы интересно узнать, что они соответствуют Firefox на этом. Возможно, поведение, которое вы видите, происходит только в Chrome. Похоже, что поведение Firefox соответствует текущей спецификации. – sideshowbarker

+0

У меня такая же проблема, и мы также используем двухстороннюю настройку SSL. Кроме того, я не получаю код статуса - Firefox просто прерывает вызов ajax. Вы когда-нибудь это поняли? – heez

+0

В принципе, это ошибка, которая даже работает в Chrome. Спектр говорит, что глагол OPTION не должен использовать сертификат клиента, когда он делает запрос. Если вы отклоняете все подключения без сертификата клиента, вы никогда не сможете получить запрос OPTIONS. Вы можете заставить nginx отправить обратно 200 для вас и, тем не менее, не заставлять ваше обслуживание видеть OPTION. Это то, что я попробую, потому что CORS практически бесполезен, если он не переносится. https: //bugzilla.mozilla.org/show_bug.cgi? id = 1019603 # c9 – Rob

ответ

1

Я действительно не тестировал это с помощью клиентских сертификатов, но, похоже, я помню, что Firefox не будет отправлять учетные данные, если Access-Control-Allow-Origin установлен вместо подкаталога * вместо фактического домена. См. this page о MDN.

Также существует проблема с отправкой Firefox запроса CORS на сервер, который ожидает, что сертификат клиента будет представлен в рукопожатии TLS. В принципе, Firefox не будет отправлять сертификат во время предполета, создавая проблему с курицей и яйцом. См. this bug о bugzilla.

+0

комментарий от коммиттера Chrome на странице https://bugzilla.mozilla.org/show_bug.cgi?id=1019603#c9 подсказывает, что ошибка здесь присутствует в Chrome и что поведение Firefox - это то, что требует текущая спецификация. Поэтому было бы интересно узнать, что здесь делают Сафари и Эддж. – sideshowbarker

+0

Действительно. Если выяснится, что интерпретация Firefox правильная, как же тогда реализовать аутентификацию сертификата клиента на бэкэнд? Может быть, используя анонимный SSL для первоначального подключения, пересматривая после предполета? Я не уверен, что это даже сработает. – AfroThundr

+0

Это правильный ответ на вопрос. Причиной разницы в поведении браузера является просто ошибка в Chrome. Firefox, Edge и Safari выполняют все, что требуется спецификациям - то есть они не включают сертификаты клиентов SSL/TLC в предполетных запросах. См. Соответствующий ответ на странице https://stackoverflow.com/questions/46783506/why-is-the-tls-client-certificate-not-being-included-in-preflight-request-on-mos/46783730#46783730 – sideshowbarker

Смежные вопросы