Этот вопрос как бы связан с этим Почему мой сервер не поддерживает ALPN?
Но в моем случае то же самое тест говорит, что ALPN поддерживается, даже если я не использую OpenSSL1.0.2, а только OpenSSL1.0.1t
В настоящее время я использую Apache2.4.25 с активированным h2. Но меня все еще беспокоит, что ALPN поддерживается, даже если мой OpenSSL не поддерживает его?
Мой http2.conf в conf-enabled:
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)
Встречные вопросы приветствуются!
В ldd
вывод не включает никаких ссылок на libssl.so
. Это означает, что ваш Apache использует статически связанную версию библиотеки SSL, что означает, что OpenSSL включен в двоичный файл Apache2.
Итак, ваш Apache2 не использует библиотеку SSL в вашей системе.
Я не могу найти никакого другого объяснения, кроме предположения, что у вас могут быть установлены две версии openSSL (или результаты теста неверны).
Mod_http2 Apache2 основан на nghttp2, и его документы (https://nghttp2.org/documentation/nghttpx-howto.html#alpn-support) штат:
Поддержка 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/#application-layer-protocol-negotiation-alpn) - основное различие между двумя людьми, которые объявляют протоколы. Но я просто не могу найти логического объяснения вашим выводам, поэтому должен спросить, уверены ли вы в своих предпосылках.
Вы можете обслуживать HTTP / 2 без ALPN (я проверил, используя тест / инструмент, с которым вы связались), но я не могу найти ничего, чтобы объяснить, почему ALPN будет отображаться как поддерживаемый.
Единственное, что я смог найти, - это отчет об ошибке для RH, где эта проблема обсуждается довольно подробно:
https://bugzilla.redhat.com/show_bug.cgi?id=1276310
Есть предположения, что команда RH может что-то с этим сделать, но я не вижу четких указаний на обратный перенос ALPN в 1.0.1. И не знаю, актуально ли обсуждение RedHat в вашем случае.
Кажется, что apache 2.4.25 из тестового репо скомпилирован вместе с libssl 1.0.2, что объясняет, почему сервер поддерживает ALPN, даже если OpenSSL_1.0.2 не установлен в системе.
Я не могу напрямую комментировать вопрос ALPN, но ldd
не следует использовать на /usr/sbin/apache2
если только apachectl -M
указывает, что ssl_module или http2_module являются статическими, а не общими (shared является значением по умолчанию для большинства модулей). использовать ldd $(locate mod_ssl.so)
соотв. ldd $(locate mod_http2.so)
вместо. Оттуда должно быть возможно узнать, с какой версией вы действительно связаны.