我使用的是一个软件应用程序,它使用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 chain
和cert key
(如有需要还有密码)
方案3的服务器端配置:使用NettyServerBuilder.sslContext
添加由SSL Context Builder构建的GrpcSslContexts.forServer
并设置cert chain
和cert 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文件中。
答案 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。