示例代码:C# MQTTS双向认证(客户端)(服务器EMQX)

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


目录

CA证书、客户端证书和私钥

emqx的MQTTS设置

客户端代码


CA证书、客户端证书和私钥

        使用单向认证时客户端只需要确认服务器证书有效(也可以不确认),一般服务器自签名证书需要将服务器证书的签发者CA的证书放在客户机的受信任的证书签发机构里或程序直接读取CA证书文件。

        证书包含公钥和CA的签名,别人通过验证证书正确性来确认你的身份,与证书对应的私钥则用来解密别人发给你的加密数据(用证书里的公钥加密,只有对应的私钥才能解密,这保证了只有你可以解密)。

        CA证书原则上可以通过操作系统预置加上互联网检索来验证,但是很多时候用的是自签名的CA证书,上互联网验证是没用的,需要手动安装证书告诉操作系统这个证书我认可或者程序直接读取证书文件。

        双向认证时服务端也要确认客户端的证书,因此客户端需要提供客户端证书和签发者的证书,并且客户端证书的签发机构也必须在服务器的受信任名单里。

        一般情况下我们用服务器给的客户端证书,编程的时候需要的就是服务端给的CA证书(同时也是服务器证书的签发者)和客户端证书。

        windows上包含私钥的证书多用pfx格式,unix/linux上则多用pem格式。格式的问题很头疼,我只能说我下面演示的代码在windows上正确执行了,不代表在linux上也能正确执行。

        很多库使用三个文件:CA证书、证书、私钥,CA证书文件其实可以包含多个根证书,后两个是服务器或客户端的证书和私钥,多为pem格式。如果使用pfx格式就只需要两个文件:CA证书和pfx文件(同时包含证书和私钥)。

        单独的证书和私钥多用.cer、.key的扩展名,其实格式一般也是pem文件,扩展名不同而已。pem文件格式可以包含多个私钥、证书(简单地堆进去即可)。

        从两个pem生成一个pfx:

openssl pkcs12 -export -out client.pfx -inkey client.key -in client.cer

        其中key和cer都是pem格式(有时候也用pem后缀名)。 

emqx的MQTTS设置

        在浏览器里设置:

        点击一下监听器的名称,右侧会显示详情,往下拉,重点在下面:

        “验证服务器证书”开关打开才能选择证书文件,这几个证书是emqx安装的时候自带的。感觉这个“服务器”其实是客户端的意思,MQTT概念里并没有服务器、客户端,只有代理(broker)、发布者、订阅者。

        verify_none不验证客户端证书,verify_peer验证客户端证书。

        “Fail If No Peer Cert”这个选项有点坑,如果前面不是verify_peer,而客户端没有客户端证书,这个选项为true就一定会导致连接失败。按照常理既然选择可不验证客户端,那么这个选项应该被忽略才对。

        上图的设置效果是必须使用双向验证。

客户端代码

//参数对象
MqttClientOptionsBuilder mqttClientOptions = new();

//常规的IP端口等参数
				_ = mqttClientOptions
				.WithTcpServer(hostname, port)
				//.WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311)
				.WithClientId(client_id)
				.WithCleanSession(false)
				.WithKeepAlivePeriod(TimeSpan.FromSeconds(30))
				.WithCredentials(userid, passwd);


//构造认证所需的参数

					X509Certificate2 caCert = new(caCertpath);//受信任的CA证书文件
					X509Certificate2 clientCert = new(clientCertpath);//客户端证书和私钥,如果是密码保护的pfx文件,可以用(.pfx,passwd)
					var newCert = new X509Certificate2(clientCert.Export(X509ContentType.SerializedCert));//怀疑这步就是为了去掉密码保护

					X509Certificate2Collection certificates = [];
					_ = certificates.Add(caCert);
					_ = certificates.Add(newCert);

					MqttClientTlsOptions tlsOptions = new MqttClientTlsOptions
					{
						UseTls = true,
						AllowUntrustedCertificates = false,
						SslProtocol = SslProtocols.None, //根据需要选择 TLS 版本,None表示系统选择,Default已经废弃 
						ClientCertificatesProvider = new DefaultMqttCertificatesProvider(certificates),//加载证书
						CertificateValidationHandler = ValidateCertifiCertificates//避免证书验证,关键!没这个连接不返回也不报异常
					};
					_ = mqttClientOptions.WithTlsOptions(tlsOptions); // tls选项
				

//连接,用的是MQTTnet.Client
public IMqttClient mqttClient;
mqttClient.ConnectAsync(mqttClientOptions.Build());

(这里是文档结束)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记录IMX6ULL开发板上移植SQLite3并运行Qt程序

文章目录 概要移植SQLite3Qt程序部署实验现象 概要 基于上一章对使用Qt运行对应的实验实例来完成对用户使用ui界面完成对SQLite数据库的增删改查等操作。本文旨在对上一句节的Qt程序部署到IMX6ULL开发板,并且完成对SQLite数据库在IMX6ULL开发板上的移植。 移植SQ…

达梦数据库(DM)线程管理

目录标题 达梦数据库(DM)线程管理笔记一、DM 线程架构概述二、DM 主要线程类型及功能(一)监听线程(二)工作线程(三)IO 线程(四)调度线程(五&#…

02.10 TCP之文件传输

1.思维导图 2.作业 服务器代码&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> …

Node.js 环境配置

什么是 Node.js Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行时环境&#xff0c;它允许你在服务器端运行 JavaScript。传统上&#xff0c;JavaScript 主要用于浏览器中的前端开发&#xff0c;而 Node.js 使得 JavaScript 也能够在服务器上执行&#xff0c;…

【办公类-53-04】20250209Python模仿制作2024学年第二学期校历

背景需求&#xff1a; 马上开学了&#xff0c;又要制作校历&#xff08;删划节假日&#xff09;。之前我都是用网络的图片&#xff0c;然后在PPT里修改。 存在问题&#xff1a; 网络校历是从周日开始的&#xff0c;但日常我们老师做教案&#xff0c;都是默认从周一到周五&…

KERL文献阅读分享:知识图谱与预训练语言模型赋能会话推荐系统

标题期刊年份Knowledge Graphs and Pre-trained Language Models enhanced Representation Learning for Conversational Recommender SystemsJournal of LaTeX Class Files2021 &#x1f4c8;研究背景 在数字时代&#xff0c;个性化推荐系统已经成为了我们生活的一部分。从电…

强一致性算法:Raft

目录 什么是 Raft 算法&#xff1f; Leader的选举 投票分裂后的选举过程 Raft算法日志复制过程 修复不一样的日志 数据安全性的保证 什么是 Raft 算法&#xff1f; Raft 算法是一种是一种用于管理复制日志的强一致性算法&#xff0c;用于保证分布式系统中节点数据的一致…

[MyabtisPlus]PG的TIMESTAMPTZ不支持转换为LocalDateTime

背景 数据库用的是PG&#xff0c;且created_time字段用的是带时区的timestamptz类型&#xff1a; 用MyabtisPlus(MP)的的代码生成&#xff0c;默认生成的是JDK8的LocalDateTime类型&#xff1a; 结果&#xff0c;在查询时候&#xff0c;无法做到实体类的类型自动转换&#xff0…

cliproxy代理服务使用指南

Cliproxy代理服务使用指南 一、引言 Cliproxy&#xff0c;作为一款高效稳定的代理服务工具&#xff0c;广泛应用于跨境电商、数据分析、网络爬虫、远程办公等领域。本指南旨在帮助用户快速上手Cliproxy&#xff0c;充分利用其代理服务&#xff0c;提升工作效率与数据安全。 二、…

【Java 面试 八股文】Redis篇

Redis 1. 什么是缓存穿透&#xff1f;怎么解决&#xff1f;2. 你能介绍一下布隆过滤器吗&#xff1f;3. 什么是缓存击穿&#xff1f;怎么解决&#xff1f;4. 什么是缓存雪崩&#xff1f;怎么解决&#xff1f;5. redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&…

防火墙术语大全( Firewalld Glossary of Terms)

防火墙术语大全 防火墙作为网络安全中不可或缺的设备&#xff0c;在各种网络架构中扮演着至关重要的角色。无论是企业级防火墙、云防火墙还是家用路由器内置的防火墙&#xff0c;它们的工作原理和配置策略都离不开一系列专业术语的支撑。对于网络工程师来说&#xff0c;掌握这…

【蓝耘元生代智算云平台】一键部署 DeepSeek人工智能模型

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

配置@别名路径,把@/ 解析为 src/

路径解析配置 webpack 安装 craco npm i -D craco/craco 项目根目录下创建文件 craco.config.js &#xff0c;内容如下 const path require(path) module.exports {webpack: {// 配置别名alias: {// 约定&#xff1a; 使用 表示src文件所在路径: path.resolve(__dirname,src)…

力扣hot100刷题第一天

哈希 1. 两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。你可以按任意…

【前端】几种常见的跨域解决方案代理的概念

几种常见的跨域解决方案&代理的概念 一、常见的跨域解决方案1. 服务端配置CORS&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff1a;2. Nginx代理3. Vue CLI配置代理&#xff1a;4 .uni-app在manifest.json中配置代理来解决&#xff1a;5. 使用WebSocket通讯…

以下是基于巨控GRM241Q-4I4D4QHE模块的液位远程控制系统技术方案:

以下是基于巨控GRM241Q-4I4D4QHE模块的液位远程控制系统技术方案&#xff1a; 一、系统概述 本系统采用双巨控GRM241Q模块构建4G无线物联网络&#xff0c;实现山上液位数据实时传输至山下水泵站&#xff0c;通过预设逻辑自动控制水泵启停&#xff0c;同时支持APP远程监控及人工…

百度高德地图坐标转换

百度地图和高德地图的侧重点不太一样。同样一个地名&#xff0c;在百度地图网站上搜索到的地点可能是商业网点&#xff0c;在高德地图网站上搜索到的地点可能是自然行政地点。 高德地图api 在高德地图中&#xff0c;搜索地名&#xff0c;如“乱石头川”&#xff0c;该地名会出…

Photoshop自定义键盘快捷键

编辑 - 键盘快捷键 CtrlShiftAltK 把画笔工具改成Q , 橡皮擦改成W , 涂抹工具改成E , 增加和减小画笔大小A和S 偏好设置 - 透明度和色域 设置一样颜色 套索工具 可以自定义套选一片区域 Shiftf5 填充 CtrlU 可以改颜色/色相/饱和度 CtrlE 合并图层 CtrlShiftS 另存…

carbon 加入 GitCode:Golang 时间处理的 “瑞士军刀”

在 Golang 的开发生态中&#xff0c;时间处理领域长期存在着诸多挑战。高效、精准的时间处理对于各类软件应用的稳定运行与功能拓展至关重要。近日&#xff0c;carbon 正式加入 GitCode&#xff0c;为 Golang 开发者带来一款强大且便捷的时间处理利器&#xff0c;助力项目开发迈…

项目总结: 应用程序的扩展bundle化,自定义classLoader

目录 描述事情实现的简单说明主应用业务1业务2 实现细节描述更多总结 描述事情 应用程序的主逻辑要做一件事&#xff0c;也提供了扩展。即如果想干预这个逻辑&#xff0c;业务可以自己扩展。 设计图如下&#xff1a; 应用&#xff1a;application, AppClassLoader加载&#…