无法通过SSL从客户端连接到grpc服务器

时间:2016-05-12 12:52:14

标签: java openssl grpc

在我使用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"。

更新

1 个答案:

答案 0 :(得分:0)

看起来这个例外在顶部被切断了一点。也可能存在可能有用的因果异常(“引起:”)。在任何一种情况下,这可能类似于another issue,其中gRPC“错过”原始错误,现在只是检测以后的失败。

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

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