Почему тест HTTP/2 говорит, что у меня есть поддержка ALPN, даже если у меня есть только OpenSSL1.0.1t?
Этот вопрос как бы связан с этим. Почему мой сервер не поддерживает ALPN?
Но в моем случае тот же тест говорит, что ALPN поддерживается, даже если я не использую OpenSSL1.0.2 и только OpenSSL1.0.1t.
В настоящее время я использую Apache2.4.25 с активированным h2. Но меня все еще беспокоит, что ALPN поддерживается, даже если мой OpenSSL должен его не поддерживать?
Мой http2.conf в conf-включен:
Protocols h2 h2c http/1.1
H2Push on
H2PushPriority * after
H2PushPriority text/css before
H2PushPriority image/jpeg after 32
H2PushPriority image/png after 32
H2PushPriority application/javascript interleaved
SSLProtocol all -SSLv2 -SSLv3
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 !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS'
Выход из LDD:
╰─➤ ldd /usr/sbin/apache2 1 ↵
linux-vdso.so.1 (0x00007ffc4d593000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fa1c2492000)
libaprutil-1.so.0 => /usr/lib/x86_64-linux-gnu/libaprutil-1.so.0 (0x00007fa1c2269000)
libapr-1.so.0 => /usr/lib/x86_64-linux-gnu/libapr-1.so.0 (0x00007fa1c2034000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa1c1e17000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa1c1a6c000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007fa1c1867000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fa1c165f000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007fa1c1428000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa1c1224000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fa1c0ffb000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa1c29a5000)
Встречные вопросы приветствуются!
4 ответа
Похоже, что apache 2.4.25 из репозитория для тестирования скомпилирован вместе с libssl 1.0.2, что объясняет, почему сервер поддерживает ALPN, даже если OpenSSL1.0.2 не установлен в системе.
ldd
вывод не включает в себя ссылку на libssl.so
, Это означает, что ваш Apache использует статически связанную версию библиотеки SSL, что означает, что OpenSSL включен в двоичный файл Apache2.
Итак, ваш Apache2 не использует библиотеку SSL в вашей системе.
Я не могу найти другого объяснения, кроме как предположить, что у вас могут быть установлены две версии openSSL (или результаты теста неверны).
Модуль Apache2 mod_http2 основан на nghttp2 и его документации ( https://nghttp2.org/documentation/nghttpx-howto.html):
Поддержка ALPN
Для поддержки ALPN требуется OpenSSL >= 1.0.2.
Любопытно, что в примечаниях к выпуску 1.0.1t ( https://www.openssl.org/news/openssl-1.0.1-notes.html) упоминается:
Измените поведение ALPN для вызова обратного вызова после обратного вызова SNI/servername, чтобы обновления SSL_CTX влияли на ALPN.
Отслеживание этого сообщения приводит к https://github.com/openssl/openssl/commit/1316ca80f4e1dc9339572c780d495f995fe0bad0.
Это, однако, кажется, только внесло код в 1.1.0 - я не смог найти доказательств его изменений в 1.0.1t.
Теоретически, ALPN и NPN очень тесно связаны ( https://hpbn.co/transport-layer-security-tls/) - основное различие между двумя существами, которые объявляют протоколы, Но я просто не могу найти логического объяснения вашим выводам, поэтому должен спросить, уверены ли вы в своих предпосылках.
Вы можете использовать HTTP/2 без ALPN (я проверил, используя тест / инструмент, на который вы ссылались), но я не могу найти ничего, чтобы объяснить, почему ALPN будет отображаться как поддерживаемый.
Единственное, что я мог найти, - это отчет об ошибках для RH, где эта проблема обсуждается довольно подробно:
https://bugzilla.redhat.com/show_bug.cgi?id=1276310
Есть предположения, что команда RH может что-то с этим сделать, но я не вижу четкого указания на бэкпорт ALPN в 1.0.1. И не знаю, уместно ли обсуждение RedHat в вашем случае.
Я не могу прокомментировать вопрос ALPN напрямую, но ldd
не должен использоваться на /usr/sbin/apache2
если apachectl -M
указывает, что ssl_module или http2_module являются статическими, а не общими (совместно используемыми по умолчанию для большинства модулей). использование ldd $(locate mod_ssl.so)
соответственно ldd $(locate mod_http2.so)
вместо. Оттуда должно быть возможно узнать, с какой версией вы действительно связаны.