Браузер не обновится до 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 недоступен)?