Я запускаю Apache 2.4.20 на Ubuntu, и у меня настроен SSL. у меня есть Сертификат SAN SSL и www.example.com и www2.example.com используют один и тот же сертификат.
Я получаю 421 неверно направленный запрос ошибка, когда я включаю следующее:
Protocols h2 h2c http/1.1
H2Upgrade on
H2Direct
H2WindowSize 128000
Веб-сайты работают нормально, если я их удалю.
Я получаю сообщение об ошибке, если НА ОДНОМ БРАУЗЕРЕ www.example.com и www2.example.com открыты. Если я пойду в www.example.com сначала он загрузится правильно. Я получаю сообщение об ошибке, когда загружаю второй сайт из этого SSL-сертификата SAN, например www2.example.com. Неважно, на какой сайт я захожу в первую очередь. Он всегда отвечает 421 неверно направленный запрос на втором сайте.
Что не так с моим использованием директив HTTP / 2? (Кстати, они есть в VirtualHost)
Или есть проблема с реализациями HTTP / 2 и SAN SSL?
И если это важно, и www.example.com, и www2.example.com находятся на одном сервере, размещенном в AWS.
Спасибо.
РЕДАКТИРОВАТЬ:
Я также попробовал настройки ниже с теми же результатами.
Protocols h2 http/1.1
H2Direct
H2WindowSize 128000
В конфигурации SSL
<IfModule mod_ssl.c>
SSLRandomSeed startup builtin
SSLRandomSeed startup file:/dev/urandom 512
SSLRandomSeed connect builtin
SSLRandomSeed connect file:/dev/urandom 512
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLPassPhraseDialog exec:/usr/share/apache2/ask-for-passphrase
SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
SSLSessionCacheTimeout 300
SSLOpenSSLConfCmd DHParameters "/path/dhparams.pem"
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder on
SSLCompression Off
SSLSessionTickets Off
SSLUseStapling On
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:${APACHE_RUN_DIR}/ssl_stapling(32768)
SSLProtocol all -SSLv3
SSLInsecureRenegotiation Off
SSLStrictSNIVHostCheck Off
</IfModule>
В VirtualHost
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin mail@example.com
ServerName www.example.com
DocumentRoot /path/path
Protocols h2 http/1.1
H2Direct on
H2WindowSize 128000
SSLEngine on
SSLCACertificateFile /path/cert.crt
SSLCertificateFile /path/cert.crt
SSLCertificateKeyFile /path/key.key
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
<Directory /path/path>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
</IfModule>
Для меня это было настоящей проблемой. Но я нашел ответ Вот.
Многие сайты используют один и тот же сертификат TLS для нескольких виртуальных хостов. Сертификат имеет либо подстановочное имя, например «* .example.org», либо несколько альтернативных имен. Браузеры, использующие HTTP / 2, распознают это и повторно используют уже открытое соединение для таких хостов.
Хотя это хорошо для производительности, это связано с ценой: такие хосты требуют большей осторожности при настройке. Проблема в том, что у вас будет несколько запросов для нескольких хостов на одном и том же TLS-соединении. И это делает невозможным повторное согласование, поскольку стандарт HTTP / 2 запрещает это.
Итак, если у вас есть несколько виртуальных хостов, использующих один и тот же сертификат, и вы хотите использовать для них HTTP / 2, вам необходимо убедиться, что все vhosts имеют точно такую же конфигурацию SSL. Вам нужен тот же протокол, шифры и настройки для проверки клиента.
Если вы что-то смешиваете, Apache httpd обнаружит это и вернет клиенту специальный код ответа 421 Misdirected Request.
У меня есть 3 VirtualHosts с одним и тем же сертификатом. Оба они настроены с использованием моих "стандартных" настроек SSL. У последнего была особая конфигурация, так как мне не требовалось, чтобы последний был совместим со многими браузерами, поэтому я использовал более современные шифры и только последний протокол SSL. Этот особый "особенный" VirtualHost получил 421-й.
Если я отключу протокол h2 http / 1.1, это решит проблему, но я не хотел отключать это.
После использования одной и той же конфигурации на всех VirtualHost, использующих один и тот же сертификат, проблема была устранена..
Я столкнулся с этой проблемой сегодня и сначала был немного озадачен, потому что я не использовал какие-либо другие шифры и т. Д., Поэтому я не мог понять, о чем на самом деле говорилось примечание «если вы смешиваете» из ответа выше. Что ж, оказалось, что недостаточно, если SSLCertificateFile и SSLCertificateKeyFile имеют одинаковое содержимое и если файлы даже являются идентичными копиями друг друга. Эти параметры конфигурации должны указывать на один и тот же файл! Я подозреваю, что это так, потому что на самом деле проблема не в браузере (как я изначально предполагал), а в том, что Apache уже определяет, что конфигурация не та же, и заранее блокирует любые запросы HTTP2, потому что ожидает, что браузер возникнут проблемы, если он действительно доставит страницу (что, вероятно, действительно может произойти). Apache также записывает соответствующую ошибку в свой файл журнала («Имя хоста www.example.com, предоставленное через SNI, и имя хоста www2.example.com, предоставленное через HTTP, не имеют совместимой настройки SSL»). Этот тест на совместимость настройки кажется довольно простым и не учитывает тот факт, что сертификат фактически такой же. Вероятно, он только замечает разные имена файлов / пути, а затем блокируется.