在我使用 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);
异常(exception):
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“错过”了原始错误,现在只是检测后来的故障。
这两种 channel 创建方法都应该有效。如果您使用反向代理,我会假设问题是服务器不支持 AES GCM 或 ALPN(使用 HTTP/2)。您可以使用https://www.ssllabs.com/ssltest/检查支持。例如,谷歌supports both 。如果您直接联系 gRPC 服务器,我预计初始化 tcnative 时会出现问题。
创建一个 GitHub 问题来帮助我们追踪真正的原因可能是值得的。
关于java - 无法通过 SSL 从客户端连接到 grpc 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37187488/