Браузер не обновится до H2, хотя заголовки "Upgrade" отправляются

На моем веб-сервере я пытаюсь заставить H2 (http2) работать. Установил Apache 2.4.20 через репозиторий "ondrej". Я тестировал на серверах Debian 8 и Ubuntu 14.04, но продолжаю сталкиваться с одними и теми же проблемами. У меня работает OpenSSL 1.0.2 и SSL vhosts.

Странно то, что заголовки обновления (Connection: upgrade и Upgrade: h2) отправляются. Когда я выполняю тестирование внешнего сервера, я получаю ответы, что h2 работает правильно с поддержкой ALPN. Но проблема в том, что браузеры, на которых я тестировал (Chrome и FireFox на Win7), не обновятся до H2.

Одна вещь, которую я заметил, чего не хватает, - это заголовок HTTP2-Settings, но я не могу найти ничего в какой-либо документации Apache, чтобы реализовать это или заставить Apache отправить этот заголовок.

К сожалению, я не смог протестировать с помощью cUrl, поскольку серверы, к которым у меня есть доступ, не поддерживают ни одну версию с поддержкой http2.

Мои настройки SSL vhost:

Protocols h2 http/1.1
SSLEngine On
SSLCACertificateFile xxxxxxxx
SSLProtocol all -SSLv2 -SSLv3
SSLCompression Off
SSLHonorCipherOrder On
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RSA+AES RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4 !AES128"
Header always set Strict-Transport-Security "max-age=15552000;includeSubDomains"
SSLCertificateFile xxxxxxxx
SSLCertificateKeyFile xxxxxxxx

Я использую Apache с модулем prefork вместо рабочих.

Кто может сказать мне, что не так?

3 ответа

В конце концов я получил его на работу. Это был вопрос замены SSLChiperSuite на эту строку:

SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256: ECDHE-ECDSA-AES128-GCM-SHA256: ECDHE-RSA-AES256-GCM-SHA384: ECDHE-ECDSA-AES256-G4M-SHA: $

У старого была, так сказать, опция, которая блокировала http2. Моя оценка теста SSL все еще A+ кстати.

Вы не можете перейти на h2 протокол.

Механизм обновления HTTP/1.1 - это то, что инициируется клиентами.

Если я вас правильно понял, и вы пытаетесь отправить Upgrade и HTTP2-Settings заголовки от сервера к клиенту, тогда это не имеет смысла. Клиенты отправляют эти заголовки, а не сервер.

Кроме того, хотя сам протокол HTTP/2 позволяет осуществлять обмен текстовыми сообщениями через обновление HTTP/1.1 до h2c (Обратите внимание c в конце имени протокола) производители браузеров не реализовали этот механизм и используют протокол HTTP/2 только после согласования ALPN.

В итоге:

  • Вы можете перейти с HTTP/1.1 на HTTP/2 открытым текстом (h2c), но только с не браузерными клиентами, такими как nghttp. Это объясняется здесь.
  • Механизм обновления инициируется только клиентами, и они отправят Upgrade а также HTTP2-Settings Заголовки, а не сервер.
  • Браузеры поддерживают только согласование HTTP/2 через ALPN (h2). Это означает, что вы не можете иметь открытый текст HTTP/2 между браузером и сервером.

PreFork

Вы упомянули, что используете prefork mpm. Веб-сервер Apache не будет использовать HTTP/2, если он настроен с помощью prefork mpm, по умолчанию он вернется к HTTP 1.1.

*"Disable and give warning when mpm_prefork is encountered. The server will 
continue to work, but HTTP/2 will no longer be negotiated."* ([Apache Revision 
: SECURITY: CVE-2017-9789: Read after free in mod_http2.][1])

Хотя это могло сработать в то время, когда задавался вопрос, в настоящее время это не сработает. Используйте другой mpm или переключитесь на php-pm и работника или событие.


HTTPS

Как уже упоминалось в одном из ответов, шифрование может быть проблемой. Сервер должен быть правильно настроен для HTTPS, а запросы должны обслуживаться по HTTPS.

У меня та же проблема, поэтому я опробовал ваше "решение". Но с этим cipherSuite-кодом больше всего IE, Android и Safari будут заблокированы из-за "handshake_failure"!

Это тестирование на https://www.ssllabs.com/ssltest/analyze.html

Знаете ли вы, какие из записей cipherSuite заблокировали HTTP2 (ALPN недоступен)?

Другие вопросы по тегам