关于c++ grpc 和 c# grpc 通信的问题 以及 grpc 认证问题

news2024/9/22 19:41:54

一、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();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于java的综合小区管理系统论文.doc

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统综合小区管理系统信息管理难度大&#xff0c;容错率低&am…

diamond安装与使用

1.前言 diamond是一款用于蛋白质和翻译后DNA搜索的序列比对工具&#xff0c;专为大规模序列数据的高性能分析设计。其主要特点包括&#xff1a; - 与BLAST相比&#xff0c;蛋白质和翻译后DNA的成对比对速度快100倍至10000倍。 2. 参考 https://github.com/bbuchfink/diamond …

微知-lspci如何查看pcie设备树状结构(-t)

对于查看pcie设备列表除了看是否存在 还需要看拓扑结构。如何看&#xff1f; lspci -t以减号为分割说明 第一列数字是域段 和 bus id。比如0000:00中0000是域 00是busid 第二列 01.2中01是device id。2是functionid 如果还有下游设备device还有一个指定busid的序号

[数据集][目标检测]夜间老鼠检测数据集VOC+YOLO格式316张1类别+视频文件1个

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;316 标注数量(xml文件个数)&#xff1a;316 标注数量(txt文件个数)&#xff1a;316 标注类别…

I.MX6U交叉编译Qt项目-思维导图-学习笔记-基于正点原子阿尔法开发板

I.MX6U交叉编译Qt项目 安装交叉编译器 交叉编译器介绍 拷贝fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh至ubuntu 执行下面的指令修改脚本的权限&#xff0c;修改权限后可以看到此脚本颜色显示改变&#xff0c;说明修改成功 chmod…

理解Flink算子链

前言 对于flink初学者,如果我们观察WebUi中任务执行情况,可能会有一个疑惑,为什么节点和代码中的算子对不上? 从WebUi上看起来像是一个节点,会把转换处理的很多个任务都连接在一起,合并成了一个“大任务”。这又是怎么回事呢? 算子间的数据传输 我们先来考察一下算子…

Vue 旋转动画效果

目录 前言效果演示具体代码实现 前言 这里记录一个旋转动画&#xff0c;在鼠标经过的时候停止&#xff0c;鼠标离开继续旋转。 实现思路&#xff1a; 利用keyframes关键字定义一个旋转动画 效果演示 具体代码实现 <template><div class"container"><…

Cuda 基于Cmake创建Cuda项目

文章目录 一、简介1.1GPU的优势1.2 CUDA:通用并行计算平台和编程模型 二、Cuda项目三、实现效果参考资料 一、简介 1.1GPU的优势 图形处理单元(GPU)1在相同的价格和功率范围内提供比CPU高得多的指令吞吐量和内存带宽。许多应用程序利用这些更高的功能在GPU上比在CPU上运行得更…

ESP32-C3在MQTT访问时出现“transport_base: Poll timeout or error”问题的分析(7)

接前一篇文章:ESP32-C3在MQTT访问时出现“transport_base: Poll timeout or error”问题的分析(6) 上一回说到笔者分析base_poll_write函数中的select()返回的结果可能并不是超时而是负值,并且在base_poll_write函数中添加了打印,如下所示: 当时想着是更新固件并烧录之后…

学习笔记 韩顺平 零基础30天学会Java(2024.8.20)

P522 HashSet源码解读1 P523 HashSet源码解读2 开发技巧&#xff1a;在需要辅助变量或局部变量的时候再创建 P524 HashSet源码解读3 当单链表超过8个&#xff0c;但是还可以扩容的时候&#xff0c;将会把整条链表放到扩容后的最后应该位置上&#xff08;由老师讲解的16到32引起…

Windows SDK(八)模态对话框与非模态对话框

对话框的创建 对话框分为模态对话框和非模态对话框两种形式 模态对话框&#xff1a;自建消息循环&#xff0c;并且通过EnableWindow禁用了父窗口的键盘鼠标输入达到阻塞父窗口的功能。当有对话框&#xff0c;父窗口阻塞时&#xff0c;透过对话框是无法对父窗口进行操作的&…

【一起学Rust | 框架篇 | Tauri2.0框架】tauri中rust和前端的相互调用(rust调用前端)

文章目录 前言1. rust中调用前端2. 如何向前端发送事件3. 前端监听事件4. 执行js代码 前言 近期Tauri 2.0 rc版本发布&#xff0c;2.0版本迎来第一个稳定版本&#xff0c;同时官方文档也进行了更新。Tauri是一个使用Rust构建的框架&#xff0c;可以让你使用前端技术来构建桌面…

Redis7基础篇(六)

redis复制 目录 redis复制 前引 概念 能干嘛 怎么玩 基本操作 案例演示 前期配置 实操 常用三招 一主二仆 薪火相传 反客为主 复制原理和工作流程 复制的缺点 前引 redis复制这一篇有承上启下的作用 前面的 redis几乎是单机版 一台redis 概念 能干嘛 水平扩容…

收银系统源码-购物卡与会员卡的区别

很多门店都会推出一些只有指定商品才可以使用的购物卡或不同额度、不同折扣的消费卡&#xff0c;用来进行一些商品的促销或会员储值。如今时代实体卡容易丢失&#xff0c;很多人出门不愿意带钱包卡包。如果您有这样的功能需求&#xff0c;快来看看千呼新零售2.0购物卡功能吧&am…

[FSCTF 2023]寻找蛛丝马迹

点一下&#xff0c;看到只有页面背景颜色变化 查看一下页面源码吧&#xff0c;发现第一段flag 访问一下styles.css,看到顶部有一串乱码&#xff08;应该是flag一部分&#xff09;我们用火狐的修复文字编码工具 进行修复后显示 然后再访问script.js,依旧是乱码&#xff0c;同样…

数据湖之Delta Lake

Delta Lake&#xff1a;数据湖存储层概述 Delta Lake 是一种开源的存储层技术&#xff0c;构建在 Apache Spark 的基础之上&#xff0c;旨在解决传统数据湖的可靠性、性能和数据一致性问题。它通过引入 ACID 事务、数据版本控制、时间旅行和统一的批处理与流处理等特性&#x…

【SCI/EI/SCOPUS/CNKI】第三届先进材料与装备制造国际会议(AMEM2024)

会议日期&#xff1a;2024年12月28-30日 会议地点&#xff1a;中国-云南省-昆明市 会议官网&#xff1a;https://www.iaast.cn/meet/home/Bx93wRT 出版检索&#xff1a;EI、Scopus等数据库收录 【主办单位】 国际应用科学与技术协会(IAAST) 【主讲嘉宾】 【论文出版与检…

20 数据可视化

20 数据可视化 本章概述一. `elasticsearch`实现数据统计1.1 创建用户信息索引1.1.1 控制台创建`aggs_user`索引1.1.2 `aggs_user`索引结构初始化1.1.3 创建`aggs_user`索引的`EO`对象1.1.4 用户类型枚举1.1.5 数据初始化****************************************************…

引入本地iconfont图标

iconfont-阿里巴巴图标库官网&#xff0c;搜索想要的图标 1、加入购物车 2、添加至项目 头部的资源管理&#xff0c;点我的项目 找到对应的项目&#xff0c;点击 下载至本地&#xff0c;是个zip压缩包 解压缩一下&#xff0c;copy一下文件&#xff0c;放到项目里&#xff0c;…

打印空心正方形(c语言)

1.//KiKi学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“* ”组成的“空心”正方形图案。 //输入描述 : //多组输入&#xff0c;一个整数&#xff08;3~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成正方形边的“…