【安全】进阶的Mosquitto:搭建一个安全的MQTT服务

目录

  • 一、基础版Mosquitto安装及运行
    • Mosquitto安装
    • Mosquitto运行
  • 二、基础安全版Mosquitto安装及运行(需要输入密码)
    • Mosquitto安装
    • Mosquitto配置
    • Mosquitto测试
      • 效果
  • 三、安全版Mosquitto安装及运行
    • Mosquitto安装
    • TLS安装
    • Mosquitto配置
    • Mosquitto测试
      • 效果
  • 注意

一、基础版Mosquitto安装及运行

Mosquitto安装

  • 添加存储库
$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
  • 更新软件包
$ sudo apt-get update
  • 安装
$ sudo apt-get install mosquitto -y
  • 安装命令行客户端
$ sudo apt-get install mosquitto-clients 

Mosquitto运行

参数描述
-h服务器主机,默认localhost
-t指定主题
-u用户名
-P密码
-i客户端id,唯一
-m发布的消息内容
  • 订阅
$ mosquitto_sub -t "test/#" -m "hello"
  • 发布
$ mosquitto_sub -t "test/#"

二、基础安全版Mosquitto安装及运行(需要输入密码)

Mosquitto安装

  • 添加存储库
$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
  • 更新软件包
$ sudo apt-get update
  • 安装
$ sudo apt-get install mosquitto -y
  • 安装命令行客户端
$ sudo apt-get install mosquitto-clients -y

Mosquitto配置

$ sudo nano /etc/mosquitto/mosquitto.conf
pid_file /var/run/mosquitto.pid # 消息持久存储 
persistence true 
persistence_location /var/lib/mosquitto/ # 日志文件 
log_dest file /var/log/mosquitto/mosquitto.log # 其他配置 
include_dir /etc/mosquitto/conf.d ###添加用户验证信息# 禁止匿名访问 
allow_anonymous false # 认证配置 
password_file /etc/mosquitto/pwfile # 权限配置 
acl_file /etc/mosquitto/aclfile 
  • 认证配置pwfile
    创建用户信息文件
$ sudo touch /etc/mosquitto/pwfile 
  • 添加用户信息
$ sudo mosquitto_passwd /etc/mosquitto/pwfile user1 #user1为用户名,输入密码为 123456
$ sudo mosquitto_passwd /etc/mosquitto/pwfile user2 #user2为用户名,输入密码为 123456
  • 用户权限配置aclfile
$ sudo nano /etc/mosquitto/aclfile
# user1只能发布以test为前缀的主题,订阅以$SYS开头的主题即系统主题 
user user1 
topic write test/# 
topic read $SYS/# # user2只能订阅以test为前缀的主题 
user user2 
topic read test/#
  • 配置完成后重启服务
$sudo service mosquitto restart

Mosquitto测试

参数描述
-h服务器主机,默认localhost
-t指定主题
-u用户名
-P密码
-i客户端id,唯一
-m发布的消息内容
  • 订阅
$ mosquitto_sub -h localhost -t "test/#" -u user1 -P 123456 -i "client1"
  • 发布
$ mosquitto_pub -h localhost -t "test/abc" -u user2 -P 123456 -i "client3" -m "How are you?"

效果

发布者:
在这里插入图片描述
订阅者:
在这里插入图片描述

三、安全版Mosquitto安装及运行

Mosquitto安装

  • 添加存储库
$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
  • 更新软件包
$ sudo apt-get update
  • 安装
$ sudo apt-get install mosquitto -y
  • 安装命令行客户端
$ sudo apt-get install mosquitto-clients -y

TLS安装

  • 生成私有证书颁发机构(CA)以将 TLS 与 Mosquitto 一起使用
    – 进入mosquitto的安装目录下的certs文件夹
$ cd /certs/mosquitto/certs

– 创建一个 2,048 位的根密钥并保存在 ca.key 文件中

$ openssl genrsa -out ca.key 2048

– 使用之前创建的保存在 ca.key 文件中的 2,048 位私钥,并生成一个带有自签名 X.509 数字证书的 ca.crt 文件。该命令使自签名证书的有效期为 3,650 天,该值在 -days 选项之后指定:(附:ca.crt是CA机构的证书,用来证明CA是CA)

$ openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt

注意:输入上述命令后,openssl将会询问一些信息,这些信息将被合并入证书中。若不想输入,可以直接按Enter。其中,common name这一项需要输入,例如输入“0.0.0.0”。

– 运行以下命令可显示生成的证书颁发机构证书文件的数据和详细信息:

$ openssl x509 -in ca.crt -noout -text
  • 为 Mosquitto 服务器创建证书
    – 生成一个 2,048 位的根密钥并保存在 server.key 文件中
$ openssl genrsa -out server.key 2048

– 生成证书签名请求(CSR)。使用先前创建的保存在 server.key 文件中的 2,048 位私钥,生成一个 server.csr 文件 (附录:csr文件用于向CA机构请求一个证书)

$  openssl req -new -key server.key -out server.csr

注意:输入上述命令后,openssl将会询问一些信息,这些信息将被合并入证书中。若不想输入,可以直接按Enter。其中,common name这一项需要输入,输入服务器的ip“0.0.0.0”。

  • 为 Mosquitto 服务器生成一个带有签名的 X.509 数字证书的 server.crt 文件。 该命令使签名证书的有效期为 3,650 天,该值在 -days 选项之后指定。(附录:最后生成服务器端的证书,server.crt证书)
$ sudo openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256
  • 修改上述生成文件的权限,使得能访问它们
$ sudo chmod 777 XXX

Mosquitto配置

$ sudo nano /etc/mosquitto/mosquitto.conf
#允许匿名访问
allow_anonymous true#定义监听接口
listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key#定义tls等级
tls_version tlsv1.3
  • 配置完成之后重启mosquitto
$ sudo service mosquitto restart

Mosquitto测试

  • 订阅
$ mosquitto_sub -p 8883 -h 192.168.64.130 --cafile ca.crt -t t1 --debug
  • 发布
$ mosquitto_pub -p 8883 -h 192.168.64.130 --cafile ca.crt -t t1 --debug -m "hello"

效果

发布者:

在这里插入图片描述
订阅者:
在这里插入图片描述

注意

  • ca的ip和server的ip要不一样
  • 加上 mosquitto_pub or mosquitto_sub 的时候加上 -debug,会输出具体的信息

参考:
https://www.cxyzjd.com/article/weixin_34363171/88845986
http://www.steves-internet-guide.com/mosquitto-broker/
https://segmentfault.com/a/1190000014250065
纠错:https://stackoverflow.com/questions/34693520/mqtt-server-with-ssl-tls-error-unable-to-load-server-key-file

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

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

相关文章

PHP 循环引用的问题

问题 为了引出问题, 先来看下面一段代码: <?php $arr [a, b,c, d, ];foreach ($arr as &$each){echo $each; } echo PHP_EOL; foreach ($arr as $each){echo $each; }这段代码很简单, 输出数组的元素两次, 感觉会输出两次 abcd? 不好意思, 输出结果如下:  是不是感…

揭开HTTPS的神秘面纱

在说HTTP前&#xff0c;一定要先介绍一下HTTP&#xff0c;这家伙应该不用过多说明了&#xff0c;大家每天都在用&#xff0c;每一次HTTP请求&#xff0c;都是一次TCP连接。遗憾的是&#xff0c;请求的内容在TCP报文中是明文传输的&#xff0c;任何人截取到请求都可以读取其中的…

递归函数两种方式的区别

概述 递归函数都不陌生&#xff0c;比如计算n的阶乘&#xff1a; function f($n){if($n < 1) return 1;return $n * f($n-1); } 当然&#xff0c;有人可能会这么写&#xff1a; function f($n, $result){if($n < 1) return $result;return f($n-1, $n*$result); } 上…

Trie树

概述 在Google中随意搜索&#xff0c;如下所示&#xff1a; 他会自动显示相关的搜索&#xff0c;不知道有没有想过这个功能是如何实现的呢&#xff1f;面对海量的数据&#xff0c;它怎么能在我输入的同时&#xff0c;如此快速的检索到相关内容呢&#xff1f;当我查找资料后&am…

Python元组是什么

引出 在使用Python过程中&#xff0c;列表、集合和字典是比较常用的数据结构。 列表简单说就是数组&#xff0c;不对&#xff0c;它就是数组 集合就是去重的元素结构&#xff0c;和JAVA中的set一样 字典就是一个key-value的键值对&#xff0c;和JAVA中的HashTable一样 但是…

B+树

引言 时隔一年&#xff0c;我又想起当初看数据库时&#xff0c;看到的B树&#xff0c;就是数据库的索引使用的数据结构。再整理一下&#xff0c;看看自己没有忘记很多吧。 概述 B树之前&#xff0c;先来看一下二叉查找树&#xff08;1,2,3,4,5,6,7&#xff09; 恩&#xff0…

Python导入运行的当前模块报错

引言 今天遇到了一个奇怪的现象&#xff0c;简单举个栗子&#xff1a; 文件结构如下&#xff1a; 其中tt.py文件中定义了一个方法&#xff1a; def tt():print(tt) 我现在要在test.py中使用tt(), 代码如下&#xff1a; from test.tt import tt ​ if __name__ __main__:t…

Python中的+=

引出 今天在运行之前写的一个Python脚本时&#xff0c;发生了一个奇怪的现象&#xff08;我怎么老遇到奇怪的现象&#xff5e;&#xff5e;&#xff09;。当时的代码大概长这样&#xff1a; a [1, 2, 3] b [4, 5, 6] # ...一大段逻辑 c a c b # ...一大段逻辑 # 在这里&a…

js new Date 创建时间默认是8点

起因 最近在写一个页面&#xff0c;需要用到时间控制。然后我通过new Date()传入日期字符串创建了一个对象&#xff0c;并与当前时间做时间戳比较&#xff0c;结果12点刚过&#xff0c;就出问题了。举个栗子&#xff1a; // 假设当前时间是2019年12月22日0点20分 new Date(20…

Ubuntu14升级MySQL

最近需要将测试环境的MySQL从5.6升级到5.7. 我就自己先虚拟机搭了一个Ubuntu14进行模拟升级, 不得了 开始了各种踩坑记录 方案一 此方案可以跳过, 全是坑. 搜索 Ubuntu14 MySQL升级5.7, 出现很多结果 查看后发现处理方法全都一样, 既然大家都是这么升级的, 肯定么得问题. …

微信朋友圈技术实现设想

前提 微信朋友圈是我们每天都在用的功能, 但是如果让你来实现一个微信朋友圈, 你会如何做呢? 我来简单设想一下. 实现功能 发朋友圈评论动态查看朋友圈(只能查看好友的)查看评论(只能查看共同好友的) 是不是看着很简单? 也没有几个功能嘛. so easy. 开始实现 数据库选用…

redis的多路复用是什么鬼

有没有人和我一样, 自打知道了redis, 就一直听说什么redis单线程, 使用了多路复用等等. 天真的我以为多路复用是redis实现的技术. 今天才发现, 我被自己骗了, 多路复用是系统来实现的. 对不起自己的专业了. 为了引出多路复用, 我来大胆设想一下技术的发展路程. 前提 一个应用…

WebSocket小叙

概述 刚看到WeSocket的时候&#xff0c;我以为是HTTP相关&#xff0c;但是在前两天搭了一个简单的Client之后, 我发现这不就是TCP长连接么? 建立连接->通信->断开连接. 直到今天, 我在调试的时候, 发现发出了HTTP请求, 我想, 事情可能不是我想的那样. 先来简单描述一下…

PHP实现RPC(简版)

概述 RPC这个东西是什么? 第一次听说他, 还要在它的前边加个G, 当时我以为GRPC是一项技术, 后来才知道, 并不是这样. GRPC只是RPC的谷歌实现. 谷歌搜了一下, RPC就是一种: 远程函数调用, 看到这里, 我已经等不及了, 不往下看了, 先自己实现一个. 如果只给你这样一个概念, 如…

GC算法-复制算法

概述 复制算法就是将内存空间二等分, 每次只使用其中一块. 当执行GC时, 讲A部分的所有活动对象集体移到B中, 就可以讲A全部释放. 画个图就是: ​ 在执行GC前, 内存长这样: ​ 当执行GC后, 内存就变成这样了: 还记得标记清除算法的问题是什么吗? 内存碎片化严重. 现在好了, …

GC算法-标记压缩算法

概述 还记得标记清除和复制算法的问题么? 堆使用效率低和碎片化问题. 那么有没有能够利用整个堆, 有没有内存碎片化问题的算法呢? 这就是标记压缩算法了. 简单来说, 标记压缩算法就是将堆中的所有活动对象整体向左移, 将对象间的空隙消除. 在GC执行前的内存: GC执行后的内…

PHP usort 函数底层排序

引出 最近在一个项目中, 需要对一个数组的顺序进行调整, 允许手动将某一个元素提到数组的开头位置. 在这里, 使用了PHP中的usort函数进行了数组的排序, 代码大致如下: usort($arr, function ($a, $b){// 这里添加了 order 字段, 默认为0, 将order大的提到前边return $b[order…

密钥交换算法: 迪菲-赫尔曼算法

概述 迪菲-赫尔曼算法用于通信双方交换密钥. 还记得之前介绍HTTPS协议的时候, 提到需要先通过对方公钥来进行密钥的交换, 然后再通过密钥对通信内容进行加密. 迪菲-赫尔曼算法就是用于交换密钥的. . 此算法与非对称加密算法不同哦. OK, 一起来看看吧. 引入 在正式介绍迪菲-…

纠错码简介

纠错码是个什么东西 引出 网络中的通信基于TCP和UDP两个通信协议, 这大家都知道的, 什么TCP的三次握手等等, 面试经常被问到. 三次握手是为了保证连接的正确建立. 但是, 在通信的时候, 你如何保证你的消息正确送达了呢? 有人说了, 有收到请求的响应包. 但我说的不是这个, 比…

计算机全加器简单实现

概述 用了这么久计算机, 都知道计算机有一个核心部件叫 CPU, 而 CPU中有一个小部件叫做全加器. 它是用来做什么的呢? 看名字就知道了, 做加法运算用的. 那么如何实现一个全加器呢? 你以为这又是一篇计算机内部原理的文章? 不, 放开那个女孩, 和我一起走进中学物理的课堂. …