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

问题描述:

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

我可以成功地启动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”文件。

已更新。

看起来这个例外在顶部被切断了一点。可能还有一个因果异常(“由......引起”),这可能会有所帮助。无论哪种情况,这可能与another issue类似,其中gRPC“遗漏”了原始错误,现在只是检测后来的失败。

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

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

+0

感谢您的回复。我能够使用grpc文档中为SSL提供的代码成功建立连接,在客户端代码上提供客户端.crt文件,在服务器端提供私钥和服务器.crt文件。 –

+0

还存在另一个问题。客户既没有例外,也没有到达服务器。不知何故,SSL的相同代码通过grpc-java github示例项目获得成功。我可以从我的项目中看到grpc-java示例实现的唯一区别是osdetector的版本。由于这个问题,我无法包含osdetector 1.4.0(http://*.com/questions/37160085/gradle-not-able-to-detect-osdetector-plugin)。而grpc-java有1.4.0,并且在gradle构建期间使用skipcodegen = true参数成功构建。 –

+0

@DivijeNarasimhachar,我不希望osdetector版本成为问题。我唯一的想法是在服务器端使用错误的SslContext:'GrpcSslContexts.forClient()',或者在客户端使用'GrpcSslContexts.forServer()'。这真的很难被注意到,因为我错误地听到了这个错误。 –