Android grpc错误:TLS ALPN协商失败,协议:[grpc exp,h2]
我正在尝试在Android应用程序中使用grpc 守则的重要部分如下: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
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()