[英]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.