Java gRPC - TLS - 如何在客户端设置相互TLS?

时间:2018-01-22 19:39:46

标签: security ssl https grpc grpc-java

我使用的是一个软件应用程序,它使用gRPC在客户端和服务器之间建立双向流。

我正在寻找类似于这张票的答案,只有在java:How to enable server side SSL for gRPC?

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

场景1 :明文(不加密)

场景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的服务器端配置:使用NettyServerBuilder.sslContext添加由SSL Context Builder构建的GrpcSslContexts.forServer并设置cert chaincert key (如有需要还有密码)

方案3的服务器端配置:使用NettyServerBuilder.sslContext添加由SSL Context Builder构建的GrpcSslContexts.forServer并设置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())为网络通道设置TLS,其中clientAuthCertFile是信任证书文件,ClientAuth.OPTIONAL也可以如果您需要相互TLS,请ClientAuth.REQUIRED

我的客户端配置有什么不对吗?我需要调整吗?在这篇文章中得到社区的一些祝福后,我会将此作为PR添加到security.md文件中。

1 个答案:

答案 0 :(得分:0)

我在这里向grpc-java项目添加了一个hello world TLS PR https://github.com/grpc/grpc-java/pull/3992

最新版本的grpc-java只要合并这个pr就会有一个非常好的工作hello-world示例。所以你要做的就是git clone来自master的项目,看看示例/ README.md。