Java gRPC - TLS - 如何在客户端设置双向 TLS?

Java gRPC - TLS - how to set up mutual TLS on the client side?

我开发的软件应用程序使用 gRPC 在客户端和服务器之间建立双向流。

我只在 java 中寻找与此票证答案类似的内容:

我想配置我的应用程序,以便他们可以选择他们想要使用的 TLS 方案:

场景一:明文(未加密)

场景 2:服务器端 TLS

场景 3:相互 TLS

对于 TLS 设置,我在非 Android 环境中使用 Java,因此我只会考虑使用 https://github.com/grpc/grpc-java/blob/master/SECURITY.md#openssl-statically-linked-netty-tcnative-boringssl-static

的 OpenSSL 安装方案

配置 服务器端 似乎非常简单,因为它有很好的文档记录:https://github.com/grpc/grpc-java/blob/master/SECURITY.md#mutual-tls

以下是相应 TLS 选项的步骤:

场景 1 的服务器端配置:使用builder.usePlaintext

场景 2 的服务器端配置:添加由 SSL Context Builder 使用 GrpcSslContexts.forServer 构建的 NettyServerBuilder.sslContext 并设置 cert chaincert key(如果需要还有密码)

方案 3 的服务器端配置:添加由 SSL Context Builder 使用 GrpcSslContexts.forServer 构建的 NettyServerBuilder.sslContext 并设置 cert chaincert key(和密码,如果需要),并在 sslContextBuidler 上设置一个 trustManager 设置为信任证书文件。

服务器端部分有很好的文档记录,非常好。

现在我想在客户端配置一个NettyChannelBuilder。我唯一能找到的信息是在这个单元测试中:https://github.com/grpc/grpc-java/blob/master/interop-testing/src/test/java/io/grpc/testing/integration/TlsTest.java

以下是我认为需要的配置,但需要得到确认。

场景 1 的客户端配置:使用 nettyChannelBuilder.usePlaintext(true)。这将禁用 netty 通道上的 TLS 到 grpc。

方案 2 的客户端配置:使用 nettyChannelBuilder.negotiationType(NegotiationType.TLS).sslContext(GrpcSslContexts.configure(SslContextBuilder.forClient(), SslProvider.OPENSSL).build()) 设置 sslContext。这将配置通道以使用默认密码和应用程​​序协议配置通过 TLS 与 grpc 服务器通信。

方案 3 的客户端配置:使用 nettyChannelBuilder.negotiationType(NegotiationType.TLS).sslContext(GrpcSslContexts.configure(SslContextBuilder.forClient(), SslProvider.OPENSSL).sslContextBuilder.trustManager(clientAuthCertFile) .clientAuth(ClientAuth.OPTIONAL).build()) 为 netty 通道设置 TLS,其中 clientAuthCertFile 是信任证书文件,[=如果您需要双向 TLS,26=] 也可以是 ClientAuth.REQUIRED

我的客户端配置有什么不正确的地方吗?我需要任何调整吗?在得到社区对此 post.

的一些祝福后,我会将其作为 PR 添加到 security.md 文件中

我在此处的 grpc-java 项目中添加了一个 hello world TLS PR https://github.com/grpc/grpc-java/pull/3992

最新版本的 grpc-java 一旦这个 pr 被合并,就会有一个非常好的工作 hello-world 示例。所以你所要做的就是 git 从 master 克隆那个项目,然后查看 example/README.md.