为什么即使我只有 OpenSSL1.0.1t,HTTP/2 测试也会说我支持 ALPN?

为什么即使我只有 OpenSSL1.0.1t,HTTP/2 测试也会说我支持 ALPN?

这个问题和这个有点相关为什么我的服务器不支持 ALPN?

但就我而言,同样测试 确实说即使我没有使用 OpenSSL1.0.2 而只使用 OpenSSL1.0.1t,ALPN 也受支持

我目前正在使用 Apache2.4.25 并激活了 h2。但令我困扰的是,即使我的 OpenSSL 不支持 ALPN,ALPN 也受支持?

我的 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)

欢迎提出反问!

答案1

输出ldd不包含任何对 的引用libssl.so。这表明您的 Apache 使用了 SSL 库的静态链接版本,这意味着 OpenSSL 包含在 Apache2 二进制文件中。

因此,您的 Apache2 不使用系统上的 SSL 库。

答案2

除了暗示你可能安装了两个版本的 openSSL(或者测试结果错误)之外,我找不到任何其他解释。

Apache2 的 mod_http2 基于 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) - 两者之间的主要区别在于谁宣布了协议。但我就是找不到对你的发现的逻辑解释,所以不得不问你是否确定你的前提。

您可以在没有 ALPN 的情况下提供 HTTP/2(我使用您链接到的测试/工具进行了检查),但我找不到任何可以解释为什么 ALPN 会显示为受支持的东西。

我能找到的唯一其他线索是 RH 的错误报告,其中详细讨论了这个问题:

https://bugzilla.redhat.com/show_bug.cgi?id=1276310

有建议称 RH 团队可能会对此采取措施,但我没有看到任何明确迹象表明 ALPN 会反向移植到 1.0.1。并且不知道 RedHat 相关讨论是否与您的情况相关。

答案3

看起来测试 repo 中的 apache 2.4.25 是与 libssl 1.0.2 一起编译的,这解释了为什么即使系统上没有安装 OpenSSL1.0.2,服务器也支持 ALPN。

答案4

我无法直接评论 ALPN 问题,但除非表明 ssl_module 或 http2_module 是静态的而不是共享的(大多数模块默认为共享),否则ldd不应使用。改用resp。从那里应该可以找出您真正链接的版本。/usr/sbin/apache2apachectl -Mldd $(locate mod_ssl.so)ldd $(locate mod_http2.so)

相关内容