这个问题有点相关,为什么我的服务器不支持 ALPN?
但在我的情况下, 即使我没有使用 OpenSSL1.0.2 并且仅使用 OpenSSL1.0.1t,同样的测试确实表明支持 ALPN
我目前正在使用激活 h2 的 Apache2.4.25。但是即使我的 OpenSSL 不应该支持 ALPN,它仍然让我感到困扰?
我启用了 conf 的 http2.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)
反问表示赞赏!
ldd
输出不包含对libssl.so
. 这表明您的 Apache 使用 SSL 库的静态链接版本,这意味着 OpenSSL 包含在 Apache2 二进制文件中。因此,您的 Apache2 不使用系统上的 SSL 库。
除了建议您可能安装了两个版本的 openSSL(或测试结果错误)之外,我找不到任何其他解释。
Apache2 的 mod_http2 基于 nghttp2,其文档 ( https://nghttp2.org/documentation/nghttpx-howto.html#alpn-support ) 指出:
奇怪的是,1.0.1t ( https://www.openssl.org/news/openssl-1.0.1-notes.html ) 的发行说明提到:
跟踪该消息会导致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)——两者之间的主要区别在于谁宣布协议. 但是我根本无法为您的发现找到合乎逻辑的解释,因此必须询问您是否确定您的前提。
您可以在没有 ALPN 的情况下提供 HTTP/2(我使用您链接到的测试/工具进行了检查),但我找不到任何东西来解释为什么 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 一起编译,这就解释了为什么即使系统上没有安装 OpenSSL1.0.2,服务器也支持 ALPN。
我不能直接评论 ALPN 问题,但除非表明 ssl_module 或 http2_module 是静态的而不是共享的(共享是大多数模块的默认设置) ,否则
ldd
不应使用。分别使用。反而。从那里应该可以找出您真正链接的版本。/usr/sbin/apache2
apachectl -M
ldd $(locate mod_ssl.so)
ldd $(locate mod_http2.so)