我对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机器上运行的?有没有办法调试问题以弄清楚发生了什么?
您的代码正在正确地使用自签名证书实现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组指令,可结合条件码访问指令加深理解 在机器指令水平上理解如何对跳转指令编码 如上图,通过反汇编软件得到机器指令与汇编语言,其中左边为机器指令编码,右边为对应汇编语言含义