当前,我有一个ngnix服务器(在端口5001上),其后正在运行gRPC服务器,其中nginx已启用TLS。所有gRPC客户端都需要将请求发送到nginx端口,该端口转发到正在运行的gRPC服务器。最初用于测试使用usePlaintext()的gRPC请求,并且一切正常,但是最终目标是使用TLS。这里的要求是(因为这是内部应用程序),gRPC通道请求不需要通过证书,而是在创建通道时执行“跳过证书”。 谷歌搜索之后,我发现了有关TLS的示例,但所有示例均采用.cert,.key文件。下面是我尝试过的代码段,它在服务器端失败,无法验证证书
(java code)
ManagedChannel channel = NettyChannelBuilder.forAddress(<server IP address>, 5001).sslContext(GrpcSslContexts.forClient().trustManager
(new File(<.cert file>).build())
.build();
做更多的研究,我发现Golang具有InsecureSkipVerify(),通过它我可以跳过证书检查(如果我错了,请纠正我)
tc := credentials.NewTLS(&tls.Config{
InsecureSkipVerify: true,
})
现在如何在Java中完成相同的工作?
答案 0 :(得分:3)
TLS的用途值得怀疑,因为它可以被简单地MITM化,因此gRPC不“支持”。我高度建议向客户端提供适当的根证书以验证服务器。
也就是说,您可以通过将Netty的InsecureTrustManagerFactory
传递到SslContextBuilder.trustManager(TrustManagerFactory)
来解决gRPC的API:
NettyChannelBuilder.forAddress("<server IP address>", 5001)
.sslContext(GrpcSslContexts.forClient()
.trustManager(InsecureTrustManagerFactory.INSTANCE)
.build())
.build();