当前位置: 首页 > 知识库问答 >
问题:

C 语言中对 GRPC 的 TLS 支持#

郭盛
2023-03-14

我对C#很陌生,我需要使用GRPC而不是TLS。

作为预演,我将修改主grpc repo中提供的示例,以使用TLS。为了做到这一点,我找到了另一个看起来很好的答案:如何为gRPC启用服务器端SSL?。然而,我得到一个错误< code >未处理的异常:Grpc。core . RPC exception:Status(Status code =不可用,Detail="Connect Failed")(下面是完整的跟踪)。

如果我在原始的非tls代码中指定了不正确的端口或只是不启动服务器,则会出现相同的错误。我在Ubuntu上使用dotnet core。

代码的重要部分如下所示,在github的一个分叉上也有完整的代码。

客户:

  var cacert = File.ReadAllText(@"../ca.crt");
  var clientcert = File.ReadAllText(@"../client.crt");
  var clientkey = File.ReadAllText(@"../client.key");
  var ssl = new SslCredentials(cacert, new KeyCertificatePair(clientcert, clientkey));
  var channel = new Channel("localhost", 555, ssl);
  var client = new Greeter.GreeterClient(channel);

  String user = "you";

  var reply = client.SayHello(new HelloRequest {Name = user});
  Console.WriteLine("Greeting: " + reply.Message);

  channel.ShutdownAsync().Wait();
  Console.WriteLine("Press any key to exit...");
  Console.ReadKey();

服务器:

  var cacert = File.ReadAllText(@"../ca.crt");
  var servercert = File.ReadAllText(@"../server.crt");
  var serverkey = File.ReadAllText(@"../server.key");
  var keypair = new KeyCertificatePair(servercert, serverkey);
  var sslCredentials = new SslServerCredentials(new List<KeyCertificatePair>() {keypair}, cacert, false);

  var server = new Server
  {
    Services = {Greeter.BindService(new GreeterImpl())},
    Ports = {new ServerPort("0.0.0.0", 555, sslCredentials)}
  };
  server.Start();


  Console.WriteLine("Greeter server listening on port " + Port);
  Console.WriteLine("Press any key to stop the server...");
  Console.ReadKey();

  server.ShutdownAsync().Wait();

程序的完整输出:

$ cd GreeterClient
$ dotnet run -f netcoreapp1.0

Unhandled Exception: Grpc.Core.RpcException: Status(StatusCode=Unavailable, Detail="Connect Failed")
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Grpc.Core.Internal.AsyncCall`2.UnaryCall(TRequest msg)
   at Grpc.Core.DefaultCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method`2 method, String host, CallOptions options, TRequest request)
   at Grpc.Core.Internal.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method`2 method, String host, CallOptions options, TRequest request)
   at Helloworld.Greeter.GreeterClient.SayHello(HelloRequest request, CallOptions options)
   at Helloworld.Greeter.GreeterClient.SayHello(HelloRequest request, Metadata headers, Nullable`1 deadline, CancellationToken cancellationToken)
   at GreeterClient.Program.Main(String[] args)

和服务器:

$ cd GreeterServer/
$ dotnet run -f netcoreapp1.0
Greeter server listening on port 50051
Press any key to stop the server...

我是不是犯了什么愚蠢的错误,或者这不是在非windows机器上运行的?有没有办法调试问题以弄清楚发生了什么?

共有1个答案

夹谷鸿福
2023-03-14

您的代码正在正确地使用自签名证书实现Mutual TLS-我能够在Windows netcore上运行它而无需任何更改。

我确实需要稍微调整一下证书生成脚本

  • CLIENT-COMPUTERNAME添加环境变量定义,用于客户端/CN(Common Name)
  • 添加一个-config选项来摆脱无法在config错误中找到'distinguished_name'(可能是Windows上的openssl)

我能够通过故意不匹配客户端连接到的主机(127.0.0.1而不是localhost)来重现相同的错误消息。因此,也许您只需要重新生成密钥,例如localhost作为客户端的通用名称。

 类似资料:
  • 多重分支是组成分支结构的重要语句,甚至比单独的 if 语句用的更广泛一些。 1. 语法 if (条件判断) { 满足上述条件要执行的语句 } else { 不满足上述条件要执行的语句 } 执行过程 2. 场景 当需要程序作出不同的选择,并在选择后要分别执行不同的程序的时候使用。这有点像我们经常遇到非此即彼的选择。也就是如果你好好学习就会收到奖赏,否则你会…… 此处省略很多字。因为

  • C 语言与大多数计算机语言一样是按照语句的顺序逐条执行的。如同流水一样,从上到下顺序执行。这就如同我们每天的日常生活,对于上班族来说,就是起床,洗漱,吃早饭,上班,午饭。下班,晚饭,睡觉。感觉一切都平淡无奇。但是如果你想去购买一台电脑怎么办?这不是一件每天都发生的流水事件,而且你需要在有足够的钱的情况下才能购买。这个时候,你就要在满足有钱的条件下打破原有的生活顺序,去卖场购买一台电脑。这就是生活中

  • 要想实现一些复杂的功能,依靠简单的分支结构和多重分支结构等等是远远不够的。所以我们还需要分支嵌套结构。 1. 分支嵌套结构的语法 if (条件 1) { if (条件 2) { 执行语句 1 } else { 执行语句 2 } } else { if (条件 3) { 执行语句 3

  • 指针(Pointer)就是内存的地址,C语言允许用一个变量来存放指针,这种变量称为指针变量。指针变量可以存放基本类型数据的地址,也可以存放数组、函数以及其他指针变量的地址。 程序在运行过程中需要的是数据和指令的地址,变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符:在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址;程

  • 主要内容:对数组的总结,关于查找和排序数组(Array)是一系列相同类型的数据的集合,可以是一维的、二维的、多维的;最常用的是一维数组和 二维数组,多维数组较少用到。 对数组的总结 1) 数组的定义格式为: type 为数据类型,arrayName 为数组名,length 为数组长度。 需要注意的是: 数组长度 length 最好是常量表达式,例如 10、20*4 等,这样在所有编译器下都能运行通过;如果 length 中包含了变量,

  • 本文向大家介绍汇编语言 跳转指令与C语言的条件分支,包括了汇编语言 跳转指令与C语言的条件分支的使用技巧和注意事项,需要的朋友参考一下 跳转指令 跳转指令也是一个组的指令,称为j组。其中jmp为无条件跳转,其余为条件跳转 上图为j组指令,可结合条件码访问指令加深理解 在机器指令水平上理解如何对跳转指令编码 如上图,通过反汇编软件得到机器指令与汇编语言,其中左边为机器指令编码,右边为对应汇编语言含义