关于c++ grpc 和 c# grpc 通信的问题 以及 grpc 认证问题
一、c++ 和 c# 通信
c# 端服务器 如果域名 输入的是 https ,则 c++ 端需要匹配使用,也就是c++ 端需要进行安全认证。如果是http 则c++ 端不需要认证(基于c#的grpc 未 通信成功)
参考如下网址可以写一个简单的 .net grpc服务器 (无论是https 还是 http 都通信成功),工程中的launchSettings.json 可设置监听的域名与端口,


二、.net 知识
在运行 .NET Core 应用程序时,提示使用 SSL(即 HTTPS),通常情况下,.NET Core 可以生成自签名证书来简化开发和测试过程。以下是一些常见的情况和配置:
自签名证书生成
在开发环境中,.NET Core SDK 会自动生成自签名证书,以便于使用 HTTPS。这些证书通常会在本地的开发环境中创建,并由 ASP.NET Core 自带的开发证书工具 (dotnet dev-certs) 进行管理。你可以通过以下命令生成或管理这些证书:
dotnet dev-certs https –trust
这个命令会生成一个自签名证书并将其标记为受信任,适用于本地开发和测试。
在生产环境中的证书
在生产环境中,通常需要使用由受信任的证书颁发机构(CA)签发的证书。你需要从 CA 处获得证书,并将其配置到你的 Web 服务器中(如 Kestrel、IIS、NGINX 等)。
总结
- 开发环境:.NET Core SDK 会自动生成并管理自签名证书。
- 生产环境:你需要从受信任的 CA 获得证书,并在 Web 服务器中配置它。
确保在生产环境中使用正确的证书和配置,以确保安全性。

在 开发 c++ grpc 客户端 与 c# 服务端时 ,c# 程序就是默认使用的 https , 所以c++ 客户端需要如果需要连接的话,,就必须使用认证,,需要一个证书
根据上述截图的 dotnet dev-certs https -ep ./certificate.crt --trust --format PEM 可导出证书文件。
三、c++ grpc 客户端认证。。只需要输入认证文件就可以了
//客户端应用
void EventClientTest()
{
//读文件auto ReadFile = [](const std::string& filename) {std::ifstream file(filename);if (!file.is_open()) {throw std::runtime_error("Unable to open file: " + filename);}return std::string((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());};// 配置 SSL 证书grpc::SslCredentialsOptions ssl_opts;//ssl_opts.pem_root_certs = ReadFile("certificate.crt"); // 服务器证书ssl_opts.pem_root_certs = ReadFile("server.crt"); // 服务器证书auto creds = grpc::SslCredentials(ssl_opts);// 创建 SSL 凭据auto credentials = grpc::SslCredentials(ssl_opts);//创建 grpc 通道EventClient enent(grpc::CreateChannel("localhost:6001", credentials));//不认证的方式
// EventClient enent(grpc::CreateChannel(
// "localhost:6001", grpc::InsecureChannelCredentials()));
// std::string user("world");// std::string reply = enent.Dispatch(user);
// qDebug() << "Greeter received: " << reply.c_str();//rpc 调用enent.SubDispatch();
}
四、c++ grpc 服务端
需要自己使用openssl 工具生成 证书,
生成 key:
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
生成证书:CN 是域名。。:
openssl req -new -x509 -key server.key -out server.crt -days 365 -subj "/CN=localhost"
试了 该域名支持服务器ip 为 localhost 和 0.0.0.0 的连接
void GrpcServer::serverWait()
{std::string server_address = absl::StrFormat("%s:%d", m_ip, m_port);grpc::EnableDefaultHealthCheckService(true);grpc::reflection::InitProtoReflectionServerBuilderPlugin();//读文件auto ReadFile = [](const std::string& filename) {std::ifstream file(filename);if (!file.is_open()) {throw std::runtime_error("Unable to open file: " + filename);}return std::string((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());};//服务端则需要两个,一个是密钥,一个认证文件std::string server_cert = ReadFile("./server.crt");std::string server_key = ReadFile("./server.key");std::string ca_cert = ""; //ca 认证文件是需要向机构申请的,自用不需要// 设置服务器证书grpc::SslServerCredentialsOptions::PemKeyCertPair key_cert_pair;key_cert_pair.private_key = server_key;key_cert_pair.cert_chain = server_cert;grpc::SslServerCredentialsOptions ssl_opts;ssl_opts.pem_key_cert_pairs.push_back(key_cert_pair);ssl_opts.pem_root_certs = ca_cert;// 创建服务器凭证auto server_creds = grpc::SslServerCredentials(ssl_opts);ServerBuilder builder;// Listen on the given address without any authentication mechanism.builder.AddListeningPort(server_address, server_creds);// Register "service" as the instance through which we'll communicate with// clients. In this case it corresponds to an *synchronous* service.for(auto service : m_listService){builder.RegisterService(service.get());}// Finally assemble the server.m_server = builder.BuildAndStart();qCritical() << "Server listening on " << server_address.c_str();// Wait for the server to shutdown. Note that some other thread must be// responsible for shutting down the server for this call to ever return.m_server->Wait();
}
相关文章:
关于c++ grpc 和 c# grpc 通信的问题 以及 grpc 认证问题
一、c 和 c# 通信 c# 端服务器 如果域名 输入的是 https ,则 c 端需要匹配使用,也就是c 端需要进行安全认证。如果是http 则c 端不需要认证(基于c#的grpc 未 通信成功) 参考如下网址可以写一个简单的 .net grpc服务器 (…...
C++进阶(14)类型转换、IO流
文章目录 一、类型转换C语言隐式类型转换强制类型转换 C类型转换的情况类型转换的函数(4个) 二、IO流1、缓冲区2、提高输入输出效率3、文件操作文件权限写操作 --- ofstream文本方式写入二进制方式写入 读操作 --- ifstream文本方式读取二进制方式读取 其…...
配置oss cdn加速静态资源访问 阿里云
效果对比 配置cdn下载速度对比 步骤 1: 登录阿里云控制台控制台主页,找到并点击“对象存储 OSS” 创建存储空间(Bucket) 设置权限 步骤 2: 获取外网访问地址 步骤 3 在 CDN 中使用该地址 复制该外网访问地址 打开全站加速 DCDN/域名管理 添…...
实现 前端框架 SPA 路由功能:Hash 模式与 History 模式的手动实现
前言 在前端框架(如 Vue.js、React 等)中,路由管理通常会配置一个 router 对象来定义 URL 路径与组件的映射关系。 路径(path): 这是浏览器 URL 的一部分,比如 /home 或 /about。组件(compone…...
去中心化的新时代:Web3技术的全球影响
随着技术的不断演进,Web3正引领互联网的去中心化新时代。相较于传统的Web1和Web2,Web3通过去中心化、区块链和智能合约等技术,正在重塑网络的运作方式。这一变革不仅提升了网络的安全性和透明度,也对全球经济、社会和文化产生了深…...
初始redis:List
列表 List 相当于数组或者顺序表。 对于List来说,两侧都可以插入和删除,时间复杂度是O(1)。 有很多的操作,比如 llen 可以获取List的长度,lrem 可以删除元素 ,lrange可以去一个字符串 , lindex可以根据下标…...
Java | Leetcode Java题解之第355题设计推特
题目: 题解: class Twitter {private class Node {// 哈希表存储关注人的 IdSet<Integer> followee;// 用链表存储 tweetIdLinkedList<Integer> tweet;Node() {followee new HashSet<Integer>();tweet new LinkedList<Integer&g…...
MVC与三层架构分层
1. 应用分层 应用分层类似公司的组织架构。我们进行项目开发时,最开始功能简单,前后端放在一起开发,但随着项目功能的复杂,项目会被前端和后端不同的团队接手,甚至更细粒度的团队。甚至后端开发也会根据功能再进行细分…...
Go语言基础--switch
在Go语言中,switch语句是一种非常强大的控制流结构,它允许一个变量的值与多个case进行比较,并根据匹配的结果执行不同的代码块。与C、C或Java中的switch不同,Go语言的switch更灵活,支持没有显式条件的switch࿰…...
【数字ic自整资料】AXI握手协议及outstanding
参考资料: ic基础|时序篇:握手协议valid和ready的时序优化_valid和ready握手信号-CSDN博客 https://zhuanlan.zhihu.com/p/365573848 1、AXI握手协议 当我们遇到时序违例时,通常采用的方式为插入寄存器(打拍)或者是…...
C++ //练习 18.13 什么时候应该使用未命名的命名空间?
C Primer(第5版) 练习 18.13 练习 18.13 什么时候应该使用未命名的命名空间? 环境:Linux Ubuntu(云服务器) 工具:vim 解释 当需要将实体限定在特定文件中,并且不会作用于不同文件…...
yum小bug
这个错误是在克隆的机子上安装mysql时,查看有无mysql发现的 [rootwebserve-2 backup] # yum list installed | grep mysql Repository cr is listed more than once in the configuration Repository fasttrack is listed more than once in the configuration 这…...
GDB的基本使用
我有话说 因为时间和精力原因,本文写的虎头蛇尾了,除了启动调试与程序执行以外只有少量截图演示,只是简单的说明。如果有需要可以联系我,我有时间的话会把演示补上,谢谢理解。 启动调试与程序执行 启动调试并传递参数…...
如何利用AI创作高质量的文章
讯飞星火 利用AI创作高质量的文章需要遵循以下步骤: 确定主题和目标受众:在开始写作之前,明确文章的主题和目标受众。这将帮助你确定文章的风格、结构和内容。 收集资料和信息:在撰写文章之前,进行充分的研究&#x…...
开源的量化交易领域平台vn.py(VeighNa)
一:vn.py(VeighNa)下的工具以及社区版和Elite版的区别 vn.py是一款广泛应用于量化交易领域的开源软件,它主要有以下用途和功能: 1. 交易系统开发框架:vn.py提供了一个完整的交易系统开发框架,可…...
选择搜索引擎进行搜索
<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>选择搜索引擎进行搜索</title><script>function searchSelectedEngine() {var keyword document.getElementById(keyword).value;var engine document.getEl…...
安卓framework修改density
安卓平台,不同屏幕分辨率需要修改density值,以适配UI显示,比如字体大小等. 命令行下进入安卓SDK源码的device/目录 再根据不同芯片厂进入不同目录, 比如展锐就是 cd device/sprd, 高通是device/qcom/搜索关键字"ro.sf.lcd_density", grep -nr “ro.sf.lcd_density”…...
我们如何将数据输入到神经网络中?
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 下面我拿识别美女的例子来给大家介绍如何将美女的图片数据输入到神经网络中。 此例中,待输入的数据是一张图像。为了存储图像…...
基于python模板的药品名称识别系统设计与实现
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
【第五节】Win32汇编程序设计
目录 一、汇编的第一个“helloworld” 二、汇编中的标号 三、的使用 四、数据定义 五、全局变量 六、局部变量 七、结构体 八、结构体的访问 九、获取变量地址 十、函数 十一、分支与循环 十二、内联汇编 十三、裸函数的使用 一、汇编的第一个“helloworld” .38…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
