繁体   English   中英

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

[英]Android grpc error: TLS ALPN negotiation failed with protocols: [grpc-exp, h2]

我正在尝试在 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 的情况下工作( .usePlaintext()

但我收到此错误:

java.lang.RuntimeException: TLS ALPN negotiation failed with protocols: [grpc-exp, h2]

似乎SSL 握手有问题的地方。

奇怪的是,服务器使用 BloomRCP 和 TLS 工作。

我尝试过使用不同的 minSdkVersions,也使用不同的 io.grpc.* lib 版本,并使用原始文件和运行它的基本代码创建一个空的 repo,但什么也没有,并使用不同的 CipherSuite 添加 .connectionSpec() 。

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

有客人吗? 提前致谢!

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

查看我发现这个方法的库: useTransportSecurity()

/**
* Sets the negotiation type for the HTTP/2 connection to TLS (this is the default).
...
*/
@Override
public final OkHttpChannelBuilder useTransportSecurity() { ... }

我们默认使用带有 HTTP/2 的 TLS,所以这不是问题......

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

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

最后是后端问题。 在此之后:https ://www.getambassador.io/reference/core/tls/#alpn_protocols alpn_protocol 设置如下:

alpn_protocol = h2[, grpc-epx]

应该在哪里:

alpn_protocol = h2

有了这个和客户端的这个配置,它就起作用了!

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

之前用java 1.8.0_242-b08时遇到过这个问题,升级到1.8.0_265后就没有问题了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM