禁用 gRPC TLS 中的证书检查

6

目前,我有一个NGINX服务器(在端口5001上),其中运行着一个gRPC服务器,NGINX启用了TLS。所有gRPC客户端都需要将请求发送到NGINX端口,然后转发到运行的gRPC服务器。最初为了测试,使用usePlaintext()进行了gRPC请求,并且一切都很正常,但最终目标是使用TLS。这里的要求是(因为这些是内部应用程序),gRPC通道请求不需要传递证书,而是在创建通道时执行“跳过证书”操作。 在Google搜索后,我找到了有关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个回答

14

禁用证书检查的TLS在可信度方面存在疑问,因为它可以轻松地进行中间人攻击,因此 gRPC 不支持它。 我强烈建议向客户端提供正确的根证书以验证服务器。

话虽如此,您可以通过将 Netty 的 InsecureTrustManagerFactory 传递给 SslContextBuilder.trustManager(TrustManagerFactory) 来绕过 gRPC 的 API 进行此操作:

NettyChannelBuilder.forAddress("<server IP address>", 5001)
    .sslContext(GrpcSslContexts.forClient()
      .trustManager(InsecureTrustManagerFactory.INSTANCE)
      .build())
    .build();

谢谢回复。当我尝试使用InsecureTrustManagerFactory()时,它会显示私有访问,这是否意味着有一些getter()方法可以使用?即使是单例,那么它也不应该允许我创建新对象吗?我读了一些博客,其中说我们不能使用SslContextBuilder(),只能使用GrpcSslContexts(),在这种情况下,它是否支持InsecureTrustManagerFactory()? 我正在使用以下导入:io.netty.handler.ssl.util.InsecureTrustManagerFactory; 这正确吗?如果问题太基础,请见谅。 - pkumarn
已经搞定了。我执行了 InsecureTrustManagerFactory.INSTANCE 的操作。有了这个更改,现在它可以正常工作了。感谢 Eric 提醒使用 InsecureTrustManagerFactory。 - pkumarn
1
有没有Grpc节点库的这种方法。我一直在不断收到以下错误: E0127 14:52:05.495000000 9988 ssl_transport_security.cc:1245] 握手失败,致命错误SSL_ERROR_SSL:错误:1000007d:SSL例程:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED。 - Sukhvir Singh
1
@SukhvirSingh,您有Node.js的解决方案吗?我在通过nginx时也遇到了同样的问题,即使设置了server.pem和server.key。 - James Tan
@Eric Anderson,你知道如何为Java io.grpc提供新的证书吗? - lucasvc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接