Хром форсирует http1.1 вместо h2 после 401, необходимого для спнего - PullRequest
0 голосов
/ 08 января 2019

Я настроил модуль nginx + spnego для входа пользователей через sso по определенному адресу и заметил, что, как только это происходит, chrome вызывает http / 1.1 для всего поддоменов. Без единого входа весь сайт работает с http / 2. Nginx - это (1.15.0), модуль spnego от github и текущий Chrome (v71).

Я включил отладочную информацию в nginx и там есть:

2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL ALPN supported by client: h2
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL ALPN supported by client: http/1.1
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL ALPN selected: h2
2019/01/07 14:39:11 [debug] 42132#42132: *2379 SSL ALPN supported by client: h2
2019/01/07 14:39:11 [debug] 42132#42132: *2379 SSL ALPN supported by client: http/1.1
2019/01/07 14:39:11 [debug] 42132#42132: *2379 SSL ALPN selected: h2
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL_do_handshake: -1
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL_get_error: 2
2019/01/07 14:39:11 [debug] 42129#42129: *2378 reusable connection: 0
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL handshake handler: 0
2019/01/07 14:39:11 [debug] 42129#42129: *2378 ssl new session: 057AF550:32:184
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL_do_handshake: 1
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL: TLSv1.2, cipher: "ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD"
2019/01/07 14:39:11 [debug] 42129#42129: *2378 init http2 connection

На этом этапе все в порядке - это http2, но модули отправляют код 401 и запрашивают учетные данные:

2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 header filter
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 push resources
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: ":status: 401"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: "server: nginx"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: "date: Mon, 07 Jan 2019 13:41:05 GMT"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: "content-type: text/html; charset=utf-8"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: "content-length: 590"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: "www-authenticate: Negotiate"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: "strict-transport-security: max-age=63072000; includeSubDomains; preload"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2:5 create HEADERS frame 000055B593338C60: len:133 fin:0
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http cleanup add: 000055B593338D58
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 frame out: 000055B593338C60 sid:5 bl:1 len:133

На данный момент h2 работает нормально, после этого chrome отправляет только http 1.1 alpn в ответ на страницу 401:

2019/01/07 14:41:05 [debug] 42129#42129: *2378 reusable connection: 1
2019/01/07 14:41:05 [debug] 42129#42129: *2378 event timer del: 53: 8023593525
2019/01/07 14:41:05 [debug] 42129#42129: *2378 event timer add: 53: 180000:8023706453
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL ALPN supported by client: http/1.1
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL ALPN selected: http/1.1
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL_do_handshake: -1
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL_get_error: 2
2019/01/07 14:41:05 [debug] 42129#42129: *4179 reusable connection: 0
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL handshake handler: 0
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL_do_handshake: 1
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL: TLSv1.2, cipher: "ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD"
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL reused session
2019/01/07 14:41:05 [debug] 42129#42129: *4179 reusable connection: 1
2019/01/07 14:41:05 [debug] 42129#42129: *4179 http wait request handler

После этого все будет в http / 1 для всего домена. Я настроил подстановочный сервер в nginx и проверял это много раз - до аутентификации h2 и после аутентификации http1. Сейчас я переместу конечную точку аутентификации в другой поддомен, чтобы chrome не заставлял http1 для приложения, но я все еще пытаюсь исправить. Я проверил ssl, cert, шифры - это не меняется на http / 1 и http / 2, и это не какое-либо антивирусное программное обеспечение. Также я не могу очистить это состояние и FORCE http / 2 после входа в систему, единственное, что помогает, это убить процесс chrome. Очистка кэша приложения не помогает.

Работает в IE и EDGE. Firefox по умолчанию не поддерживает единый вход и политики.

Как заставить Chrome использовать http / 2 для домена? Если это невозможно сделать на странице аутентификации, как я могу принудительно перенести это на другие страницы, кроме одного URL? Кто-нибудь знает, как заставить Chrome пересмотреть http / 2 в инструментах разработчика. Также я не смог найти никаких журналов и ошибок в Chrome о переключении с http / 2 на v1

1 Ответ

0 голосов
/ 08 января 2019

Это известная ошибка в Chrome. Это сбивает с толку тот факт, что Chrome не поддерживает единый вход через HTTP / 2, но также не поддерживает некоторые HTTP / 1 и некоторые соединения HTTP / 2 с одним и тем же доменом.

Смотрите ошибку здесь https://bugs.chromium.org/p/chromium/issues/detail?id=832586

И особенно комментарий внизу:

Корень проблемы здесь в том, что сетевой стек в настоящее время делает не поддерживает одновременные соединения HTTP / 1.1 и HTTP / 2 к одному и тому же сервер. См. Выпуск 685741, комментарии 10 и 11 о мнениях по этому вопросу. возможность.

...