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