Назад | Перейти на главную страницу

421 неверно направленный запрос с использованием HTTP / 2 и SAN SSL

Я запускаю 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»). Этот тест на совместимость настройки кажется довольно простым и не учитывает тот факт, что сертификат фактически такой же. Вероятно, он только замечает разные имена файлов / пути, а затем блокируется.