У меня есть сайт с двумя серверами 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 и фиксировали его где-нибудь. Я подозреваю, что это не проблема на стороне сервера, а что-то, что нужно сделать клиенту.
Вы тестировали в Safari? Край? Было бы интересно узнать, что они соответствуют Firefox на этом. Возможно, поведение, которое вы видите, происходит только в Chrome. Похоже, что поведение Firefox соответствует текущей спецификации. – sideshowbarker
У меня такая же проблема, и мы также используем двухстороннюю настройку SSL. Кроме того, я не получаю код статуса - Firefox просто прерывает вызов ajax. Вы когда-нибудь это поняли? – heez
В принципе, это ошибка, которая даже работает в Chrome. Спектр говорит, что глагол OPTION не должен использовать сертификат клиента, когда он делает запрос. Если вы отклоняете все подключения без сертификата клиента, вы никогда не сможете получить запрос OPTIONS. Вы можете заставить nginx отправить обратно 200 для вас и, тем не менее, не заставлять ваше обслуживание видеть OPTION. Это то, что я попробую, потому что CORS практически бесполезен, если он не переносится. https: //bugzilla.mozilla.org/show_bug.cgi? id = 1019603 # c9 – Rob