在使用grpc和java的项目中,我使用OpenSSL在客户端和服务器之间建立安全连接。

我能够成功启动grpc服务器。

文档here提到安全通道的客户端代码是这样的

ManagedChannel channel = ManagedChannelBuilder.forAddress("myservice.example.com", 443)
    .build();
GreeterGrpc.GreeterStub stub = GreeterGrpc.newStub(channel);


我在客户端使用代码如下,但是抛出以下异常。

    mChannel = ManagedChannelBuilder.forAddress(GrpcConstants.LOCAL_GRPC_CLIENT_IP, GrpcConstants.LOCAL_GRPC_CLIENT_PORT).build();

    mEmployerServicesBlockingStub = EmployerServicesGrpc.newBlockingStub(mChannel);
    mInviteContactsBlockingStub = InviteContactsGrpc.newBlockingStub(mChannel);


例外:

Network channel closed
    at io.grpc.Status.asRuntimeException(Status.java:431)
    at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:157)
    at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:106)


我也尝试了以下代码:

    mChannel = NettyChannelBuilder.forAddress(GrpcConstants.LOCAL_GRPC_CLIENT_IP, GrpcConstants.LOCAL_GRPC_CLIENT_PORT).sslContext(GrpcSslContexts.forClient().trustManager(file).build()).build();

    mEmployerServicesBlockingStub = EmployerServicesGrpc.newBlockingStub(mChannel);
    mInviteContactsBlockingStub = InviteContactsGrpc.newBlockingStub(mChannel);


这也给出了与上述相同的例外。我只是在这里给了一个空文件参考。

请让我知道GoDaddy证书应使用哪种方法。

如果这是第一种方法,那么我会缺少什么。

如果是第二种方法,那么我应该将哪个文件用于“ roots.pem”。

更新。

最佳答案

看起来顶部的异常被切除了一点。也可能存在因果异常(“ Causeed by:”),可能有帮助。无论哪种情况,这都可能与another issue类似,其中gRPC“遗漏”了原始错误,现在仅检测到以后的故障。

两种创建渠道的方法都应该起作用。如果您使用的是反向代理,我认为问题可能是服务器不支持AES GCM或ALPN(使用HTTP / 2)。您可以使用https://www.ssllabs.com/ssltest/来检查支持。例如,Google supports both。如果直接与gRPC服务器联系,则初始化tcnative会出现问题。

创建GitHub问题来帮助我们追查真正的原因可能是值得的。

10-01 06:04
查看更多