0

我正在尝试在 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"

原型似乎没问题,并且应用程序在没有 TLS 的情况下工作(.usePlaintext()

但我收到了这个错误:

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

SSL 握手似乎有问题。

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

我尝试了不同的 minSdkVersions,也使用了不同的 io.grpc.* lib 版本,并创建了一个空的 repo,其中只有 proto 文件和运行它的基本代码,但没有添加 .connectionSpec() 以及不同的 CipherSuite。

使用 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,所以这不是问题......

4

3 回答 3

1

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

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

于 2020-01-10T21:39:56.677 回答
0

最后是后端问题。在此之后: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()
于 2020-01-15T13:11:34.063 回答
0

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

于 2020-09-23T15:41:03.193 回答