无法使用 Apache HTTP 从 OkHTTP/ALPN/Linux 客户端建立 HTTP/2 连接

Posted

技术标签:

【中文标题】无法使用 Apache HTTP 从 OkHTTP/ALPN/Linux 客户端建立 HTTP/2 连接【英文标题】:Cannot establish HTTP/2 connection from OkHTTP/ALPN/Linux client with Apache HTTP 【发布时间】:2017-02-23 20:11:29 【问题描述】:

我遇到的问题与 Linux 相关,因为当同一个 HTTP2 客户端从 Windows 运行时不会发生。

$java -jar -Xbootclasspath/p:alpn-boot-8.1.9.v20160720.jar SampleOkHttp-1.0.jar https://192.168.1.10:8080/simple.html

HTTP/2 前言通信:

窗户

>> CONNECTION 505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
>> 0x00000000     6 SETTINGS
>> 0x00000000     4 WINDOW_UPDATE
<< 0x00000000     6 SETTINGS
<< 0x00000000     4 WINDOW_UPDATE
>> 0x00000003    69 HEADERS       END_STREAM|END_HEADERS
>> 0x00000000     0 SETTINGS      ACK
<< 0x00000000     0 SETTINGS      ACK
<< 0x00000003    86 HEADERS       END_HEADERS
<< 0x00000003   220 DATA          END_STREAM
h2
<< 0x00000000     8 GOAWAY

Linux

>> CONNECTION 505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
>> 0x00000000     6 SETTINGS      
>> 0x00000000     4 WINDOW_UPDATE 
>> 0x00000003    69 HEADERS       END_STREAM|END_HEADERS
<< 0x00000000     6 SETTINGS      
>> 0x00000000     0 SETTINGS      ACK
<< 0x00000000     8 GOAWAY        
<< 0x00000000     4 WINDOW_UPDATE 
<< 0x00000000     8 GOAWAY

尝试使用 Ubuntu\Fedora,从本地\远程机器,使用不同的 java\alpn 版本。我还在走神。 为什么 Apache 在 Linux 的情况下会发送 GOAWAY 消息?如何解决?

【问题讨论】:

GOAWAY 帧包含错误代码和可选的调试数据,你能转储这些吗? tools.ietf.org/html/rfc7540#section-6.8 有没有简单的方法可以通过okhttp库获取调试数据? 【参考方案1】:

密钥协商过程中出现问题。

使用 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 的 Windows 没有问题。

Linux 被拒绝,因为尝试使用 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA。

我通过在 here 描述的 Apache 配置文件 conf/extra/httpd-ssl.conf 中提供可接受的密钥解决了问题。

简而言之,我更改了 SSLCipherSuite 的默认设置:

SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK

【讨论】:

以上是关于无法使用 Apache HTTP 从 OkHTTP/ALPN/Linux 客户端建立 HTTP/2 连接的主要内容,如果未能解决你的问题,请参考以下文章

OKHttp通信使用

OKHttp通信使用

:Spring Cloud 之 okhttp

如果你想在Java代码中写一个Http客户端,你会选择哪一种方式?Okhttp vs Apache vs Jdk

http2 似乎不适用于 OkHttp3 和 retrofit2

从OKHttp框架看代码设计