【问题标题】:Not able to connect to grpc server from client through SSL无法通过 SSL 从客户端连接到 grpc 服务器
【发布时间】:2016-05-12 12:52:14
【问题描述】:

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

已更新。

【问题讨论】:

    标签: java openssl grpc


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。我能够使用 grpc 文档中为 SSL 提供的代码建立成功的连接,在客户端代码上提供客户端 .crt 文件,在服务器端提供私钥和服务器 .crt 文件。
    • 还有另一个问题。客户端既没有给出异常也没有到达服务器。不知何故,相同的 SSL 代码通过 grpc-java github 示例项目成功。从我的项目到 grpc-java 示例实现,我可以看到的唯一区别是 osdetector 的版本。由于issue,我无法包含 osdetector 1.4.0。而 grpc-java 有 1.4.0 并且在 gradle 构建期间使用 skipcodegen=true 参数成功构建。
    • @DivijeNarasimhachar,我不希望 osdetector 版本成为问题。我唯一的想法是您使用了错误的 SslContext:服务器端的GrpcSslContexts.forClient(),或客户端的GrpcSslContexts.forServer()。作为一个错字,这真的很难注意到,而且我听说会导致挂起。
    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2010-10-17
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    相关资源
    最近更新 更多