在gRPC TLS中禁用证书检查

时间:2018-09-27 15:57:40

标签: ssl ssl-certificate netty tls1.2 grpc

当前,我有一个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中完成相同的工作?

1 个答案:

答案 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();