Почему тест 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) вместо. Оттуда должно быть возможно узнать, с какой версией вы действительно связаны.

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