C# 中对 GRPC 的 TLS 支持

2023-11-22

我对 C# 相当陌生,我需要使用基于 TLS 的 GRPC。

作为一次演练,我正在修改中提供的示例主要 grpc 仓库使用 TLS。为此,我发现了另一个问题,似乎是一个很好的答案:如何为 gRPC 启用服务器端 SSL?。但是,我收到错误Unhandled Exception: Grpc.Core.RpcException: Status(StatusCode=Unavailable, Detail="Connect Failed")(完整跟踪如下)。

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

代码的重要部分如下,也可以在 fork 上找到完整的部分github.

Client:

  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();

Server:

  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 机器上运行?有没有某种方法可以调试问题以弄清楚发生了什么?


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

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

  • 添加环境变量定义CLIENT-COMPUTERNAME,用于客户端/CN(通用名)
  • 添加一个-config摆脱的选项unable to find 'distinguished_name' in config错误(可能是 Windows 上的 openssl 问题)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中对 GRPC 的 TLS 支持 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • 对象属性的 Numpy 数组[重复]

    这个问题在这里已经有答案了 我有一个多维对象数组 例如 a np array obj1 obj2 obj3 这些对象是具有多个属性的类的实例 假设其中之一是高度 其中之一是长度 为了获得相应的长度和高度的多维数组 我这样做 lengths
  • 在alwaysdata.com上部署Django

    我是 django 的新手 我尝试了这个 但无法部署 我能怎么做 usr bin python import sys import os base os path dirname os path abspath file sys path
  • 应用程序启动方法中出现异常 java.lang.reflect.InitationTargetException

    我刚刚开始使用 JavaFX 我正在尝试构建一个带有标签 文本字段和按钮的简单应用程序 单击该按钮时 会将标签的值设置为文本字段的值 一切都很顺利 直到我将控制器连接到主文件 这是我的代码 主程序 java package applicat
  • 如何从 Selenium 中调用 JavaScript 函数?

    我需要从 Firefox 中的 Selenium WebDriver 调用 JavaScript 函数 登录我的网站后 我在 Firebug 的命令编辑器中使用此命令来调用文件上传应用程序 infoPanel applicationMana
  • 无法在 asp.net core 中为身份服务器 4 启用 CORS

    好的 我已经为我的 net core API 添加了 CORS 策略 但不知何故 这些 CORS 策略不适用于 Identity Server 4 端点 我有以下 api 我尝试在其中注册用户 EnableCors AllowAllCors
  • 搜索框内的搜索按钮,如 Bing

    如何在搜索框中实现搜索按钮 如 Bing 等网站上所示 它看起来像是在里面 但实际上不是 你不能将 html 放在输入中 这 2 个元素 一个输入和一个按钮 靠得很近 边距为 0 并且高度相同 该按钮的图形有 3 像素的白边距 所以就造成了
  • OpenCV 显示 2 通道图像(光流)

    我将光流存储在 2 通道 32F 矩阵中 我想可视化内容 最简单的方法是什么 我如何转换CV 32FC2到 RGB 并带有一个空的蓝色通道 诸如此类imshow可以处理 我正在使用 OpenCV 2 C API 超级奖励积分 理想情况下 我
  • python3中的自定义比较函数

    我想按距原点 0 0 的距离按升序对 2D 坐标系中的点进行排序 我发现this并尝试了一些东西 但我仍然无法得到想要的结果 这是我的代码 from functools import cmp to key def my comp point
  • 当应用程序在后台执行 uploadTask 时,使用 NSURLSession 时出现 CFNetwork SSLHandshake failed (-9806) 错误

    当应用程序处于后台时 我在使用 NSURLSession UploadTask 上传视频文件时遇到 CFNetwork SSL 握手错误 当应用程序处于前台时 上传视频没有问题 仅当应用程序处于后台时才会出现问题 背景NSURLSessio
  • 如何在 SailsJS/Waterline 中将 Model.query() 与 Promise 一起使用?

    我在使用 Sails JS 0 9 8 时遇到问题 我想将 Promise 与 Model query 函数一起使用 我使用 sails mysql 适配器 此代码将起作用 User findOne email email then fun
  • 您是否应该仅使用准备好的语句进行转义? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我看到很多人说你应该始终使
  • 如何在 opencv 中使用矩阵 R 和 T(外部参数矩阵)转换图像?

    我有一个旋转平移矩阵 RT 3x4 opencv中是否有一个函数可以执行 RT 描述的旋转平移 我认为这个问题的很多解决方案都做出了隐藏的假设 我将尝试向您快速总结一下我对这个问题的看法 过去我不得不考虑很多 两个图像之间的变形是一个二维过
  • 使用python将此html文件转换为xml文件的最佳方法

    这个html是here div table width 720 border 0 cellspacing 0 cellpadding 0 align center height 130 tr height 129 tr table div
  • 在 C# 中将未知格式的字符串转换为日期

    我在 stackoverflow 上搜索了答案 但没有运气 我正在开发一个 Windows 应用程序 我有一些不同日期格式的字符串 例如 dd MM yyyy MM dd yyyy MM dd yyyy dd MM yyyy dd MM y
  • 如何配置 Tomcat 不区分大小写的 URL?

    我需要 Tomcat 中的 URL 不区分大小写 我的意思是当我在浏览器的地址栏中写入例如 http localhost index htm 时 不等于 http localhost INDEX htm 然后我收到错误 因为此页面 INDE
  • UpdatePanel 上的 AsyncPostBackTrigger 和 PostBackTrigger 之间的区别? [复制]

    这个问题在这里已经有答案了 我有一个GridView 加州大学洛杉矶分校 在我的UpdatePanel upnl列表 在我的里面ucLAD我有一个复选框和一个操作rowClicked
  • statx 需要哪些功能才能停止提供 EPERM

    我有一个 Qt 项目 它使用一个插件接口 可以在我的系统上正常编译 然而 当在 docker 内编译同一个项目时 它停止使用 Qt 5 10 1 并给出消息Error Undefined interface 经过一些straceing th
  • 版本冲突更新到8.4.0

    Error 任务 app processDebugGoogleServices 执行失败 请 通过更新版本来解决版本冲突 google services 插件 最新版本信息为可以在这里找到 或将 com google android gms
  • Python 输入永远不等于整数[重复]

    这个问题在这里已经有答案了 我想插入一个数字 如果我输入 4 以外的任何数字 它会告诉我这是错误的 但如果它是假的 它会告诉我 gg 你赢了 菜鸟 但是当我插入 4 时 它告诉我这是不正确的 x input Insert a numer w
  • C# 中对 GRPC 的 TLS 支持

    我对 C 相当陌生 我需要使用基于 TLS 的 GRPC 作为一次演练 我正在修改中提供的示例主要 grpc 仓库使用 TLS 为此 我发现了另一个问题 似乎是一个很好的答案 如何为 gRPC 启用服务器端 SSL 但是 我收到错误Unha