使用GRPC时SSL解密错误

时间:2017-04-10 19:10:33

标签: java node.js ssl grpc grpc-java

我正在使用GRPC版本:1.1.2& JDK版本:连接到NodeJS服务器的GRPC客户端上的1.8版本。 Java客户端能够很好地连接,但是当我断开与客户端的连接时,我总是在服务器端看到下面的例外。

例外(仅限服务器上)

E0410 15:03:19.674531000 140735121084416 ssl_transport_security.c:439] SSL_read returned 0 unexpectedly.
E0410 15:03:19.674829000 140735121084416 secure_endpoint.c:185]        Decryption error: TSI_INTERNAL_ERROR

我正在通过以下调用关闭GRPC Java连接:

channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);  //channel is ManagedChannel

我应该在拨打电话之前清理任何其他资源,还是应该使用备用机制与服务器完全断开连接?

修改 我注意到当我尝试以下操作时也会遇到同样的错误:

channel.shutdown();  

我在Mac上使用OpenSSL - 我记得更改了默认的Mac版本(OpenSSL 0.9.8zh 2016年1月14日)。

grpc中的secure_endpoint.c

 result = tsi_frame_protector_unprotect(ep->protector, message_bytes,
                                             &processed_message_size, cur,
                                             &unprotected_buffer_size_written);
      gpr_mu_unlock(&ep->protector_mu);
      if (result != TSI_OK) {
        gpr_log(GPR_ERROR, "Decryption error: %s",
                tsi_result_to_string(result));
        break;
      }

1 个答案:

答案 0 :(得分:1)

ManagedChannel.shutdown()向服务器指示不应再启动新的RPC。所有现有的RPC,尤其是流式RPC都将继续运行。完成所有这些RPC后,ManagedChannel将关闭所有基础连接,并且通道将进入终止状态。

ManagedChannel的设计与ExecutorService类似。你可以做的一件事是确保你真正关闭正确的循环调用awaitTermination:

while (!channel.awaitTermination(5, TimeUnit.Second)) {
  System.err.println("Still not terminated.");
}