【安全】进阶的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注释标记整理

什么是注释标记 我们在平常写代码或看别人写的代码时, 在方法的说明注释中经常会有这样的注释: /*** param $num* return array*/上面的*param* return 就是注释标记 注释标记用于生成文档, param指明需要接收的参数, return指明返回值 在使用 phpDocumentor 等工具生成文档…

PHP 循环引用的问题

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

redis常规命令记录

概述 因为redis是单线程执行&#xff0c;所以不用关心并发问题。 简单记录一下redis的操作命令&#xff0c;留作查阅&#xff0c;回头再整理一下事物等操作。 reids中存储的是kev-value形式, 其中的value有几种: 字符串: 就是简单的string 字符串列表: 有序可重的列表 字符…

代码整洁之道-函数

什么是一个好的函数或者叫方法&#xff0c;只要能让函数明确的表达其意图&#xff0c;让读者能够一眼看出是一个怎样的函数&#xff0c;其接收什么参数&#xff0c;返回什么结果&#xff0c;做了什么事情。能做到这&#xff0c;大概就能算作一个好的函数了&#xff0c;看上去很…

代码整洁之道-格式

对于代码的格式&#xff0c;每个人都有不同的代码风格&#xff0c;这没什么。但是对于一个团队来说&#xff0c;最好能够统一代码风格&#xff0c;在同一个项目中&#xff0c;如果到处充斥着不同的代码风格&#xff0c;相比读起来并不是那么让人舒适&#xff0c;比如在什么地方…

代码整洁之道-对象和数据结构

现在&#xff0c;有一个计算面积的需求&#xff0c;其中一种实现如下&#xff1a; class Square{public $side; } class Geometry{public function area($shape){if($shape instanceof Square){return $shape->side * $shape->side;}return 0;} }有人看了&#xff0c;你…

代码整洁之道-类

在面向对象的编程中&#xff0c;类是其中的基本单位&#xff0c;就像面向过程中的函数一样。所以在说类时&#xff0c;可以借鉴一下前面的函数&#xff0c;不如只做一件事&#xff0c;也就是所说的单一职责。 函数应该短小&#xff0c;对于类来说&#xff0c;也是这样。函数的…

Deepin nginx lumen配置

Deepin nginx lumen配置 正常安装 sudo apt install nginx sudo apt install php-fpm 启动后将 /etc/nginx/sites-enabled/default 配置文件 copy一份到 /etc/nginx/conf.d/lumen_demo.conf 然后按照该配置文件改改&#xff0c;修改后的配置文件如下&#xff1a; server {lis…

代码整洁之道小结

以下总结一些不好的代码规范&#xff0c; 借此警示自己不要犯这种错误 注释 1.不恰当的注释 注释应该仅用来描述有关代码和设计的技术性信息。像修改历史等信息不应出现在注释中 2.废弃的注释 过时、无关或错误的注释就是废弃的注释&#xff0c;不要写这种注释&#xff0c…

PHP的stdClass

概述 以下是百度百科对php中的 stdClass的描述&#xff1a; stdClass在PHP5才开始被流行。而stdClass也是zend的一个保留类。**stdClass类是PHP的一个内部保留类&#xff0c;初始时没有成员变量也没成员方法&#xff0c;所有的魔术方法都被设置为NULL.**凡是用new stdClass()的…

浮点数的运算精度丢失

引出 打开Python编译器&#xff0c;输入 0.10.2&#xff0c; 期待的结果是0.3&#xff0c;但是输出为&#xff1a; 0.30000000000000004 有点小尴尬&#xff0c;这是为什么呢&#xff1f; 解惑 其实这设计到了计算机的浮点数存储是以二进制进行存储的。 说二进制不太形象&a…

补码到底是个什么东西

概述 先引入一个前提&#xff0c;在计算机中数字是以二进制进行存储的&#xff0c;也就是我们看到的2&#xff0c;在计算机中存储的是10。我们进行的加法运算 213 在计算机中是这样的&#xff08;这里先假设计算机存储的是4位二进制数字&#xff09; 001000010011 很容以看的…

揭开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…

关于相对性的思考

换位思考是一直都在倡导的做法。也就是说&#xff0c;在考虑问题时&#xff0c;不光要站在自己的角度来思考&#xff0c;还要站在他人的角度来思考。不光要站在一个角度思考&#xff0c;要尝试多个角度来思考问题。 下面一则小故事&#xff1a; 熊大&#xff1a;熊二&#xff…

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…