Android grpc错误:TLS ALPN协商失败,协议:[grpc exp,h2]

Android grpc错误:TLS ALPN协商失败,协议:[grpc exp,h2],android,grpc,tls1.2,alpn,Android,Grpc,Tls1.2,Alpn,我正在尝试在Android应用程序中使用grpc 守则的重要部分如下: private val managedChannel: ManagedChannel = ManagedChannelBuilder .forTarget("misserverurl.com") .build() 具有版本和依赖项的build.gradle: minSdkVersion 19 implementation "io.grpc:grpc-okhttp:1.26.0" imple

我正在尝试在Android应用程序中使用grpc

守则的重要部分如下:

private val managedChannel: ManagedChannel = ManagedChannelBuilder
        .forTarget("misserverurl.com")
        .build()
具有版本和依赖项的build.gradle:

minSdkVersion 19

implementation "io.grpc:grpc-okhttp:1.26.0"
implementation "io.grpc:grpc-protobuf:1.26.0"
implementation "io.grpc:grpc-stub:1.26.0"
protos似乎还可以,而且应用程序在没有TLS的情况下也可以工作(.useplantext()

但我得到了一个错误:

java.lang.RuntimeException:TLS ALPN协商失败,协议:[grpc exp,h2]

SSL握手似乎存在问题

奇怪的是,服务器使用的是使用TLS的BloomRCP

我尝试了不同的minsdkversion,也使用了不同的io.grpc.*lib版本,创建了一个空的repo,只使用proto文件和运行它的基本代码,而不使用任何内容,并添加了带有不同密码套件的.connectionSpec()

使用Wireshark,我可以看到我发送的TLS版本是1.2,这是正确的和预期的(可能它没有使用HTTP2?)

有客人吗? 提前谢谢

---------------------------------------------------编辑---------------------------------------------------

查看我找到的库:useTransportSecurity()


默认情况下,我们将TLS与HTTP/2一起使用,所以这不是问题…

HTTP/2是在使用ALPN的TLS期间协商的。客户端发送它支持的协议(在本例中为grpc exp和h2,也称为http/2)。然后服务器选择什么协议,或者不选择。如果未选择任何协议,则唯一的选项是退回到另一个协议(如HTTP/1)或失败


gRPC需要HTTP/2,因此服务器必须通过ALPN选择“h2”。错误在于这没有发生。您的服务器需要支持HTTP/2。如果您使用的是TLS终端或L7负载平衡器,则必须将其配置为支持HTTP/2。

最后,这是一个后端问题。 在此之后: alpn_协议设置如下:

alpn_协议=h2[,grpc epx]

应在哪里:

alpn_协议=h2

客户端有了这个配置,它就成功了

private val managedChannel: ManagedChannel = ManagedChannelBuilder
        .forTarget("misserverurl.com")
        .build()

以前在使用java 1.8.0_242-b08时遇到此问题,升级到1.8.0_265后,没有问题

,但是否可能默认配置为使用TLS的用户不通过HTTP/2执行请求?如果是这样,我该如何设置它?不确定h2是否是问题所在,但不知道为什么它接受BloomRPC请求但不接受GRPC-JAVA
private val managedChannel: ManagedChannel = ManagedChannelBuilder
        .forTarget("misserverurl.com")
        .build()