【毕业设计】ESP32通过MQTT协议连接服务器(二)

news/2024/5/6 9:00:39/文章来源:https://blog.csdn.net/ZHOU_YONG915/article/details/130013205

文章目录

  • 0 前期教程
  • 1 前言
  • 2 配置SSL证书
  • 3 配置用户名和密码
  • 4 配置客户端id(client_id)
  • 5 conf文件理解
  • 6 websocket配置
  • 7 其他资料

0 前期教程

  • 【毕业设计】ESP32通过MQTT协议连接服务器(一)

1 前言

  上一篇教程简单讲述了怎么在虚拟机CentOS中用mosquitto搭建MQTT服务器,这一篇博客主要是介绍一下mosquitto的“高级玩法”

2 配置SSL证书

  前面教程配置好了mosquitto的基本数据传输,但是这个数据传输过程是明文传递,是不安全的,因此需要进行加密,这本身也是MQTT协议所支持的。
  目前MQTT服务器传输加密主要还是使用SSL/TLS协议,这个协议比较复杂,不过可以参考这篇文章简单理解一下。
  还记得安装mosquitto需要什么组件吗?没错,有openssl,这个软件可以用来生成自签的证书,可以用于测试使用,它在大多Linux发行版中有预安装。如果是要在生产环境当中使用,就不能使用openssl了,下面简单演示一下如果使用openssl生成自签证书并被客户端连接。

  • 首先需要虚拟一个CA,并为它创建私钥
openssl genrsa -des3 -out ca.key 2048

其中,-des3代表加密算法,2048表示位数,回车运行会要求输入两次密码,运行完毕后可以在当前文件夹得到CA的私钥文件:ca.key

  • 根据CA的私钥生成CA的证书
openssl req -new -x509 -days 1826 -key ca.key -out ca.crt

其中,-days表示证书有效期,在生成过程中,需要填写很多信息,除了国家必须是两个字母外,其他的基本可以随便填写。运行完毕后可以在当前文件夹得到证书文件:ca.crt

  • 然后再给服务器生成私钥
openssl genrsa -out server.key 2048

为方便起见,服务器的私钥不加密,也就是不用输入密码

  • 拿着服务器的私钥向上面虚拟的CA机构申请证书
openssl req -new -out server.csr -key server.key

此时可以得到一个server.csr的文件,注意,这个是待签名的证书,并不能直接使用。同样,在申请过程中需要填写一些信息,和上面CA机构证书申请差不多,但要注意的是Common Name字段填写要慎重,一般是填写虚拟机的内网IP

  • 用虚拟出的CA机构证书给服务器的待签名证书签名
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360

运行完毕后可以得到一个server.crt的证书(已签名生效)

如果想了解这些命令的用法,可以参考OpenSSL的中文网站


  以上就是配置ssl证书的全部过程了,运行完毕后可以得到这几个文件:

在这里插入图片描述

其中,主要有用的是三个文件:ca.crtserver.crtserver.key,建议将这三个文件移到/etc/mosquitto/Cert文件夹下,最后一级文件夹没有就新建一个,名字自定。

  建立好证书后,接下来就是改配置文件了

vi /etc/mosquitto/mosquitto.conf#主要是修改以下几项,其他的不要改动
cafile /etc/mosquitto/Cert/ca.crt
certfile /etc/mosquitto/Cert/server.crt
keyfile /etc/mosquitto/Cert/server.keylistener 8883 #带有ssl证书验证的mqtt服务器传输端口默认为8883

如果不愿意一行一行翻,可以利用/的检索功能。

需要注意:设置端口之后一定要确定一下防火墙有没有开放此端口,没有的话一定要记得开放!!!具体操作步骤见上一篇教程

修改配置文件后,如果此时mosquitto在运行,需要重启服务使配置文件生效。

参考链接


  配置好服务端,再来看看客户端怎么配置。还是用之前的MQTTX软件。需要将配置好的CA证书ca.crt放到宿主机上(不需要服务器的证书和私钥)

在这里插入图片描述

如果能连接成功,就代表服务器的SSL配置没有问题了。

3 配置用户名和密码

  之所以用户名和密码放在后面,是因为不建议在配置SSL时添加用户认证。

  用户名和密码是mosquitto安全机制中比较弱的一种 1 ,但它可以用来由服务器验证客户端(上面的SSL配置的是由客户端验证服务器,即SSL单向认证),当然,如果需要更加安全的数据传输,也可以增加客户端证书,用来证明客户端的身份,即SSL双向认证,这里就不再展开了,主要是介绍如何添加用户名和密码。

  配置用户名和密码主要是使用mosquitto_passwd这个命令。

在这里插入图片描述

常用的指令格式如下:mosquitto_passwd [-H sha512 | -H sha512-pbkdf2] [-c] -b <passwordfile> <username> <password>

其中passwordfile表示密码文件放置的位置。一般也放在/etc/mosquitto/下。

得到密码文件后,还需要修改一下配置文件

vi /etc/mosquitto/mosquitto.conf# 只需要修改以下几项
allow_anonymous false #禁止匿名登录
password_file /etc/mosquitto/pwfile #设置密码的路径

  还是那个问题,修改完配置文件记得重启服务。

systemctl restart mosquitto.service

4 配置客户端id(client_id)

  前面提到,用户名和密码是一种比较弱的安全机制,其实还有一种更弱的安全机制,那就是限制客户端的id,比如限制它的前缀,这个在配置文件当中也有。

在这里插入图片描述

可以通过限制客户端id的前缀来保证客户端的身份。

5 conf文件理解

  从上面的配置来看,其实每次都是需要修改conf配置文件,可见这个配置文件的重要性。对于这种设置,我的观点是:最好知道它里面都有些啥,但不用完全记下来,用到的时候再去仔细看

  关于这个文件,我在网上没有找到什么比较好的资料,即使有完整讲解这个文件的也都是很老的资料。而mosquitto官网提供的资料实际上也就是这个文件的手册,可以在命令行用命令man /etc/mosquitto/mosquitto.conf唤出来,可以作为最权威的参考。

  不过还是找到一个讲解这个配置文件的教程,有对这个文件的结构进行分析,而且还给出了多端口监听的例子,参考价值比较高。

理解这个配置的前提是理解MQTT v3.1 v3.1.1 v5协议,所以建议多参考MQTT官网 2

6 websocket配置

  一开始我以为配置websocket只需要在conf文件当中将协议设置为websocket即可,但是每次一设置协议,mosquitto服务就会failed,后来参考这篇博客才知道原来在编译的时候就需要设置。

  对于新版2.0.x来说,在编译阶段,需要先修改config.mk文件,将WITH_WEBSOCKETS变量改为yes,如下图所示。

在这里插入图片描述

修改完之后,先别急着编译,还需要下载安装一个组件——libwebsockets

yum install libwebsockets-devel.x86_64

如果显示找不到这个软件,那就需要先安装epel软件源:

yum install epel-release.noarch

然后再运行上面的代码。


  安装好组件后,接下来就可以正常编译安装了:

make
make install

值得一提的是,如果一开始没有加上websocket模块,那么可以通过这种方式覆盖安装,不影响原来的配置文件。

安装好之后,就可以通过修改配置文件实现多端口连接了,具体操作建议参考上面的链接。核心:一个listener对应一个protocol

7 其他资料

  • SSL and SSL Certificates Explained For Beginners
  • Creating and Using Client Certificates with MQTT and Mosquitto
  • 基于 WebSocket 的 MQTT
  • Configure a Mosquitto Bridge With SSL Encryption
  • MQTT Version 3.1.1

  1. mosquitto安全机制比较完整的介绍可以参考这个链接 ↩︎

  2. 官网的这个Getting Start很有参考价值! ↩︎

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

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

相关文章

【调试】ftrace(三)trace-cmd和kernelshark

之前使用ftrace的时候需要一系列的配置&#xff0c;使用起来有点繁琐&#xff0c;这里推荐一个ftrace的一个前端工具&#xff0c;它就是trace-cmd trace-cmd安装教程 安装trace-cmd及其依赖库 git clone https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/ c…

【Ruby学习笔记】19.Ruby 连接 Mysql - MySql2

Ruby 连接 Mysql - MySql2 前面一章节我们介绍了 Ruby DBI 的使用。这章节我们技术 Ruby 连接 Mysql 更高效的驱动 mysql2&#xff0c;目前也推荐使用这种方式连接 MySql。 安装 mysql2 驱动&#xff1a; gem install mysql2你需要使用 –with-mysql-config 配置 mysql_conf…

【DevOps】GitOps 初识(下) - 让DevOps变得更好

实践GitOps的五大难题 上一篇文章中&#xff0c;我们介绍了GitOps能为我们带来许多的好处&#xff0c;然而&#xff0c;任何新的探索都将不会是一帆风顺的。在开始之前&#xff0c;如果能了解实践GitOps通常会遇到的挑战&#xff0c;并对此作出合适的应对&#xff0c;可能会使…

数据结构和算法(一):复杂度、数组、链表、栈、队列

从广义上来讲&#xff1a;数据结构就是一组数据的存储结构 &#xff0c; 算法就是操作数据的方法 数据结构是为算法服务的&#xff0c;算法是要作用在特定的数据结构上的。 10个最常用的数据结构&#xff1a;数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树 10…

StorageManagerService.java中的mVold.mount

android源码&#xff1a;android-11.0.0_r21&#xff08;网址&#xff1a;Search (aospxref.com)&#xff09; 一、问题 2243行mVold.mount执行的是哪个mount函数&#xff1f; 2239 private void mount(VolumeInfo vol) { 2240 try { 2241 // TOD…

【LeetCode】-- 108. 将有序数组转换为二叉搜索树

1. 题目 108. 将有序数组转换为二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums &#xff0c;其中元素已经按升序排列&#xff0c;请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 …

mysql在CentOS7.x环境安装

查看当前环境的yum源 ls -l /etc/yum.repos.d/ 可以看到当前环境是没有下载mysql对应的yum源的, 所以需要去官网下载对应的yum源. 找mysql的yum源并安装 http://repo.mysql.com/ 在选择对应yum源之前, 需要看一下自己系统的版本: 进入官网后, 鼠标右击进入查看页面源代码, 因为…

Leetcode.463 岛屿的周长

题目链接 Leetcode.463 岛屿的周长 easy 题目描述 给定一个 row x col的二维网格地图 grid&#xff0c;其中&#xff1a;grid[i][j] 1表示陆地&#xff0c; grid[i][j] 0表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被…

如何从功能测试转型到自动化测试:我三年的学习经历

前言 在软件测试的领域里&#xff0c;自动化测试已经成为了不可或缺的一部分。 与传统的手工测试相比&#xff0c;自动化测试具有更高的效率和精确度&#xff0c;能够有效地减少测试时间和成本&#xff0c;同时提高测试质量。作为一个从事软件测试的人员&#xff0c;如果你想…

Oracle JDK 和 OpenJDK 有什么区别?

可能在看这个问题之前很多人和我一样并没有接触和使用过 OpenJDK 。那么 Oracle JDK 和 OpenJDK 之间是否存在重大差异&#xff1f;下面我通过收集到的一些资料&#xff0c;为你解答这个被很多人忽视的问题。 首先&#xff0c;2006 年 SUN 公司将 Java 开源&#xff0c;也就有…

智慧方政务云顶层设计与建设方案(ppt)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 对一网统管总体架构的理解物联网生态中的业务定位物联网产品与解决方案概览智联物联网管理平台总体方案智联物联网管理平台总体架构智联联连接平台(HLINK)应用架构智慧社区基于…

Linux--进程信号

前言 无人问津也好&#xff0c;技不如人也罢&#xff0c;你都要试着安静下来&#xff0c;去做自己该做的事情&#xff0c;而不是让烦恼和焦虑毁掉你不就不多的热情和定力。心可以碎&#xff0c;手不能停&#xff0c;该干什么干什么&#xff0c;在崩溃中继续努力前行&#xff0c…

export、export default 和import

&#x1f468; 作者简介&#xff1a;大家好&#xff0c;我是Taro&#xff0c;前端领域创作者 ✒️ 个人主页&#xff1a;唐璜Taro &#x1f680; 支持我&#xff1a;点赞&#x1f44d;&#x1f4dd; 评论 ⭐️收藏 文章目录前言一、export default 和 import &#xff1f;1. e…

【教学类-29-03】20230409《门牌号-黏贴版(5层*5间)灰底下划线》-(中班《我爱我家》偏数学)

作品样式&#xff1a; 背景需求 在门牌号黏贴版教学实践中&#xff0c;发现90%的幼儿都不会做 1、空格没有平均分布&#xff1a; 从5*630的门牌号中&#xff0c;随机抽取5个空格&#xff0c;有80%的概率出现“一行2个空、3行1个空”的情况。但幼儿第一次做&#xff0c;楼层都…

软考总结条款(2023-05-28系统分析师)

Raid0、 Raid1、 Raid5、 Raid10的原理、特点、性能区别 - 2023-04-07 指令集 - 2023-04-07 RISC全称Reduced Instruction Set Compute&#xff0c;精简指令集计算机。 CISC全称Complex Instruction Set Computers&#xff0c;复杂指令集计算机。 CISC既有简单指令也有复杂指…

【协议项目之 I2C】(一) 基本时序与实现

一、基本介绍 I2C协议&#xff08;集成电路总线&#xff09;使用两根线SDA和SCL实现数据传输&#xff0c;其连接如下图所示&#xff0c;总线上通过上拉电阻可以挂载各种低速外设,例如EEPROM 24C02,传感器等。   使用I2C&#xff0c;可以将多个从机&#xff08;Slave&#xf…

upload-labs pass6-pass10

1.pass-6黑名单 空格绕过 直接上传肯定不可以 这个地方配置文件虽然只过滤了.htaccess&#xff0c;.user.ini也是不可用的&#xff0c;因为这里进行了重命名&#xff0c;通过代码审计可以发现空格没有过滤&#xff0c;这是利用windows的一个特性&#xff0c;后缀后面有空格和…

EasyCVR在公共资源交易中心监控视频汇聚项目中的场景应用方案

一、背景分析 2019年5月&#xff0c;国务院办公厅印发了《国务院办公厅转发国家发展改革委关于深化公共资源交易平台整合共享实施意见的通知》&#xff08;国办函〔2019〕41号&#xff09;&#xff0c;明确深化公共资源平台整合共享&#xff0c;要求地方各级人民政府制度细化落…

1.8 函数的连续与间断

我的理解&#xff1a; 注意&#xff1a; 在处理连续性问题时&#xff0c;需要注意以下几点&#xff1a; 连续函数在一段区间内的取值具有稳定性和连续性&#xff0c;因此可以使用它们来刻画某个过程的规律。 如果一个函数在某个点处不连续&#xff0c;那么这个点就是一个间断…

C语言预处理命令(宏定义和条件编译)

C语言预处理命令&#xff08;宏定义和条件编译&#xff09; 前言 在编译和链接之前&#xff0c;还需要对源文件进行一些文本方面的操作&#xff0c;比如文本替换、文件包含、删除部分代码等&#xff0c;这个过程叫做预处理&#xff0c;由预处理程序完成。 较之其他编程语言&am…