MQTT协议 - 安全问题

一、概述:

        物联网的核心是连接万物,通过交换并分析数据使得生活更舒适与便捷。不过,敏感数据泄露或者设备被非法控制可不是闹着玩的。比如前段时间国内某著名家电企业的智能洗衣机,使用了某著名电商基于XMPP协议的物联网平台,不费吹灰之力便被黑客攻破并远程遥控,给智能家居的发展带来了一些阴影。究其本质,并不是物联网技术本身有缺陷,而是在物联网系统的设计中最基本的安全设计被工程师轻视了,才导致整个系统的崩塌。

 

在这里我们将介绍为何以及如何运用MQTT提供的安全特性来保证物联网项目的顺利实施。

安全对于几乎所有的项目都是一个挑战,对于物联网项目更是如此:

  • 设备安全性与设备可用性之间往往是零和博弈。
  • 加密算法需要更多的计算能力,而物联网设备的性能往往非常有限。
  • 物联网的网络条件常常要比家庭或者办公室的网络条件差许多。

对于以上挑战,MQTT提供了多个层次的安全特性:

  1. 网络层:有条件可以通过拉专线或者使用VPN来连接设备与MQTT代理,以提高网络传输的安全性。
  2. 传输层:传输层使用TLS加密是确保安全的一个好手段,可以防止中间人攻击(Man-In-The-Middle Attack)。客户端证书不但可以作为设备的身份凭证,还可以用来验证设备。
  3. 应用层:MQTT还提供客户标识(Client Identifier)以及用户名密码,在应用层验证设备。

虽然MQTT提供了多重安全设计,不过世界上并没有银弹能够保障数据的绝对安全,所以应该在设计的时候就把安全放在设计目标之中并拥有相当的优先级,否则上文提到的智能洗衣机就是一个活生生的教训。

而网络层可以使用专线或者VPN超出了本文的范围,下面我们结合Mosquitto仔细了解一下传输层和应用层的MQTT安全特性。

 

加密

MQTT是基于TCP的,默认情况通讯并不加密。如果你需要传输敏感信息或者对设备进行反控,使用TSL几乎是必须的。打个比方,如果你在咖啡店用免费Wi-Fi上网,登录互联网金融的网站不支持HTTPS传输,那么你的账号信息多半已经在咖啡店的Wi-Fi日志里面躺着了……

TSL是非常成熟的安全协议,在握手的时候便可以创建安全连接,使得黑客无法偷听或者篡改内容了。使用TLS的时候有以下注意点:

  • 尽可能使用高版本的TLS。
  • 验证X509证书链防止中间人攻击。
  • 尽量使用有CA发布的证书。

当然,TLS会增加连接时开销,对低运算能力的设备而言是额外的负担,不过如果设备是长连接的话就会避免反复连接的开销。

 

Mosquitto原生支持了TLS加密,生成证书后再配置一下MQTT代理即可。

首先我们需要生成证书权威(Certificate Authority,CA)的认证和密钥,生成过程中Common Name一定要填写Fully Qualified Domain Name(测试期间用IP地址也凑合):

 

openssl req -new -x509 -days 365 -extensions v3_ca -keyout ca.key -out ca.crt

 接下来生成MQTT代理使用的密钥:

 

 

openssl genrsa -des3 -out server.key 2048

 并去除密码:

 

 

openssl genrsa -out server.key 2048

 然后为MQTT代理准备一个认证注册请求(Certificate Signing Request,CSR),这里的Common Name也要写对:

 

 

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

 最后通过CA签署这个CSR生成MQTT代理证书:

 

 

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365

 现在配置/etc/mosquitto/mosquitto.conf,确保8883端口的设置如下:

 

 

listener 8883
cafile /etc/mosquitto/tls/ca.crt
certfile /etc/mosquitto/tls/server.crt
keyfile /etc/mosquitto/tls/server.key

 重启Mosquitto服务就可以用以下命令订阅和发布消息了,当然所有消息都由TLS加密,可以无忧无虑地传递私密信息啦:

 

mosquitto_sub -h host -p 8883 -t 'topic' --cafile ca.crt
mosquitto_pub -h host -p 8883 -t 'topic' -m '15' --cafile ca.crt

 

其中,host需要与前面指定的Common Name一致,否则TLS连接会报错,错误信息也不是很直观……

认证

认证是验证设备身份的过程。拿旅行做比方,在换登机牌的时候需要出示护照以验明正身,即使别人能够假冒你的名字,但是拿不出护照便无法伪造身份。买房的时候,需要通过户口本证明你妈是你妈。

MQTT支持两种层次的认证:

  • 传输层:传输层使用TLS不但可以加密通讯,还可以使用X509证书来认证设备。
  • 应用层:MQTT支持客户标识、用户名密码以及X509证书,在应用层验证设备。

通过传输层和应用层来解释认证并不直观,下面我们直接从客户标识、用户名密码以及X509证书的角度来了解认证。

客户标识

用户可以使用最多65535个字符作为客户标识(Client Identifier),UUID或者MAC地址最为常见。

使用客户标识来认证并不可靠,不过在某些封闭的环境中或许已经足够。

用户名密码

MQTT协议支持通过CONNECT消息的username和password字段发送用户名和密码。

用户名密码的认证使用起来非常方便,不过再强调一下,由于用户名密码是以明文形式传输,在通过互联网时使用TSL加密是必须的。

Mosquitto支持用户名/密码认证方式,只要确保/etc/mosquitto/mosquitto.conf有如下设置:

 

 

password_file /etc/mosquitto/passwd
allow_anonymous false

 其中passwd文件是用来保存用户名和密码的,可以通过mosquitto_passwd来维护用户名密码。之后便可以通过如下命令订阅和发布消息了:

mosquitto_sub -h host -p 8883 -t 'topic' --cafile ca.crt -u user -P pwd
mosquitto_pub -h host -p 8883 -t 'topic' -m '9' --cafile ca.crt -u user -P pwd

 

 

这里端口使用8883是假设已经配置了TLS加密的。

结合TLS加密的用户名密码认证,已经是相对完善的安全体系了。

X509证书

MQTT代理在TLS握手成功之后可以继续发送客户端的X509证书来认证设备,如果设备不合法便可以中断连接。

使用X509认证的好处,是在传输层就可以验证设备的合法性,在发送MQTT CONNECT之前便可以阻隔非法设备的连接,以节省后续不必要的资源浪费。

如果你可以控制设备的创建和设置,X509证书认证或许是个非常好的选择。不过代价也是有的:

  1. 需要设计证书创建流程。如果你对设备有着完全的控制,在设备出厂前就能烧录X509证书到设备中,那么这条路是非常合适的。但是,对于移动设备等无法实现烧录证书的场景,用户名/密码认证或许是更好的选择。
  2. 需要管理证书的生命周期,最好通过PKI(Public-Key-Infrastructure)来管理。
  3. 如果证书泄露了,一定要立即使证书失效。一个选择是使用证书黑名单(Certificate Revocation Lists),另一个选择是提供在线证书状态协议(Online Certificate Status Protocol),方便MQTT代理及时了解证书的状态。

MQTT原生支持X509认证,生成客户证书后再配置一下MQTT代理便可。

首先生成设备密钥:

openssl genrsa -des3 -out client.key 2048

然后为准备一个设备认证注册请求:

openssl req -out client.csr -key client.key -new

最后通过CA签署这个CSR生成设备证书:

openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365

现在配置/etc/mosquitto/mosquitto.conf,确保8883端口的设置如下:

listener 8883
cafile /etc/mosquitto/tls/ca.crt
certfile /etc/mosquitto/tls/server.crt
keyfile /etc/mosquitto/tls/server.key
require_certificate true

重启Mosquitto服务就可以用以下命令订阅和发布消息了,当然所有消息都由TLS加密,可以无忧无虑地传递私密信息啦:

mosquitto_sub -h host -p 8883 -t 'topic' --cafile ca.crt --cert client.crt --key client.key
mosquitto_pub -h host -p 8883 -t 'topic' -m '95' --cafile ca.crt --cert client.crt --key client.key

可以看到,X509同时提供了完善的加密和验证,只是证书的生命周期管理的代价要比用户名密码高一些。

授权

授权是对资源的访问权限。继续拿机场做例子,在使用护照认证了用户之后,系统会根据预定决定用户可以上特定时间和班次的飞机,这就是授权。

对MQTT而言意味着对主题的订阅和发布权限。Mosquitto内置了基本的授权,那就是基于Access Control List的授权。

由于ACL是基于特定用户的,所以需要使用用户名密码认证方式。然后,在/etc/mosquitto/mosquitto.conf中指定ACL文件:

acl_file /etc/mosquitto/acl

在这个ACL文件便可以指定用户的读写权限,比如下面便可以授权用户tom读写指定主题的权限:

user tom
topic readwrite company/building/floor/#

Mosquitto只提供了基本的基于ACL的授权,更高级的基于RBAC的授权可能需要通过插件的形式自行开发了。

体系

在MQTT项目实施时,还可以考虑通过防火墙保护MQTT代理:

  • 仅允许相关的流量传递到MQTT代理,比如UDP、ICMP等流量可以直接屏蔽掉。
  • 仅允许相关端口的流量传递到MQTT代理,比如MQTT over TCP使用1883,而MQTT over TLS使用8883。
  • 仅允许某些IP地址段来访问MQTT代理,如果业务场景允许的话。

 

 

 

 

EMQX 入门教程④——快速开始 | MQTT连接订阅发布、Dashboard使用和API密钥 EMQX 入门教程④——快速开始 | MQTT连接订阅发布和Dashboard使用和API密钥 阅读详情

相关推荐

IoT安全软件:Armis二次开发_IoT网络协议安全性分析

在物联网(IoT)系统中,网络协议的安全性是确保数据传输和设备通信安全的关键。本节探讨了常见的IoT网络协议(MQTT、CoAP、HTTP和Zigbee)及其安全性问题,并介绍了如何使用Armis进行二次开发以增强这些协议的安全性。通过使用TLS/SSL、DTLS、HTTPS等加密技术,结合Armis的身份验证、授权、监控和审计功能,可以显著提高IoT系统的安全性,减少潜在的安全威胁。

chenlz2007的博客 1479

MQTT设备登录(mqtt.fx安装使用及Token生成器)

一、工具: 1.mqtt.fx链接地址:Index of /apps/mqttfx/1.7.1 我选择的是我画框的这个,根据自己的具体情况选择 2.Token生成器

A_Z_dd的博客 1万+

MQTT 学习笔记以及在项目中的实际运用

最近工作中有用到MQTT 协议,在此做一个研究学习总结和采坑指南。如果你在工作中也有用到,欢迎交流。文中如有不足之处,欢迎指正。

小羊子的技术专栏 3546

【MQTT】MQTT简介+安装+使用

MQTT 协议简介 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。 MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。 ...

我的笔记本 6万+

7、MQTT协议:特性、变体与安全实践

本文深入探讨了MQTT协议的核心特性、变体及其在不同场景下的应用与安全实践。内容涵盖MQTT的订阅与连接机制、会话管理、保留消息、协议栈支持,以及MQTT-SN和MQTT v5的新特性。同时,还介绍了MQTT在安全性方面的最佳实践和不同场景下的选择建议,帮助开发者全面理解和应用MQTT协议。

n2o3p4的博客 75

MQTT协议与交叉编译环境实现教程

本文还有配套的精品资源,点击获取 简介:MQTT是一种专为物联网(IoT)设计的轻量级消息协议,具备低开销、低带宽和高可靠性特点。本压缩包MQTT.tar.gz包含了适用于OpenSSL 1.1.1b和Paho MQTT C库的交叉编译环境代码和工具。OpenSSL提供最新的加密算法和安全修复,确保数据传输安全,而Paho MQTT C库支持在C语言中开发MQTT客户端应用...

weixin_35753291的博客 1315

MQTT连接ONENET——登录

MQTT连接ONENET

火红色祥云 1803

LangGraph的容错机制:从节点失败到图级回滚

核心概念铺垫:讲解LLM应用容错与事务性的核心概念(幂等性、重试策略、降级策略、快照、回滚、原子性、一致性、隔离性、持久性、最终一致性),对比LangGraph容错机制与传统数据库ACID事务、Apache Airflow/Kubernetes Workflow/Kubeflow Pipelines容错机制的异同;LangGraph容错机制的演进历史:用markdown表格梳理LangGraph从0.0.1到1.5.0(截止202X年X月)的容错机制发展历程;节点级别的容错:重试与降级。

AI Python 编程之道的博客 172

MQTT协议及安全详解

MQTT协议详解

深圳市多克创新科技有限公司 4596

不用公网IP,如何在内网高效搭建RustDesk远程控制服务器?基于Windows Server 2019的完整实践

本文详细介绍了在Windows Server 2019上部署RustDesk远程控制服务器的完整实践方案,无需公网IP即可实现内网高效远程控制。从环境准备、基础服务安装到网络与安全配置,提供了零成本的私有化部署指南,适用于企业、校园等内网环境。

weixin_28737073的博客 455

HFSS新手避坑指南:手把手教你用FR4基板仿真威尔金森功分器(附参数优化技巧)

本文详细介绍了使用HFSS仿真FR4基板威尔金森功分器的12个关键细节,包括介质基板设置、微带线建模、隔离电阻设置等实战技巧。特别针对微波技术中的常见问题,提供了参数优化和结果解读的实用方法,帮助新手快速掌握HFSS仿真技能。

weixin_27310417的博客 226

MQTT协议避坑指南:前端连接EMQX代理常遇到的3个安全配置问题

本文详细解析了前端开发者在使用MQTT协议连接EMQX代理时常遇到的3个安全配置问题,包括未加密连接导致的数据泄露、ClientID冲突引发的连接异常以及QoS配置不当造成的消息丢失。通过具体代码示例和解决方案,帮助开发者避免这些常见陷阱,确保物联网和实时通信应用的安全稳定运行。

weixin_28432777的博客 179

语音识别(ASR)-- Kaldi 学习笔记

语音识别(ASR)-- Kaldi学习笔记语音识别简介GMM-HMM基本原理DNN-HMM(基于神经网络)KaldiKaldi架构简介Kaldi在Windows下的安装工具准备编译OpenFST配置PortAudio配置KaldiKaldi目录说明 语音识别简介 语音识别(Speech Recognition)技术,也被称为自动语音识别(Automatic Speech Recognition, ASR)、计算机语音识别(Computer Speech Recognition)或是语音转文本识别(Spee

qq_43318971的博客 4847

聚焦于 MQTT 安全机制,结合您之前的问题(WebSocket、S7.NET、TCP、UDP、QUIC、HTTP、串口、USB、车牌识别等),我将详细讲解 MQTT 协议的安全机制原理

聚焦于 MQTT 安全机制,结合您之前的问题(WebSocket、S7.NET、TCP、UDP、QUIC、HTTP、串口、USB、车牌识别等),我将详细讲解 MQTT 协议的安全机制原理,提供 C# 代码示例(基于 .NET 8 和 MQTTnet 库),并与 S7-1200/S7-200 SMART PLC 通信以及 WebSocket/QUIC 集成,针对车牌识别物联网场景。2. C# 实现安全的 MQTT 通信(集成 S7.NET)1.2.6 其他安全措施。1.2.4 数据完整性。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 788

Unity中的坐标系及其转换方法

Unity中的坐标系及其转换方法 Unity中有四种坐标系: 1.全局坐标系 World Coordinate System 全局坐标系是用于描述场景内所有物体位置的方向的基准,也称为世界坐标系,Unity中创建的物体都是以全局坐标系中的坐标原点(0,0,0),来确定各自的位置的,可以使用transform.position来获取游戏对象的世界坐标。 2.局部坐标系 Local Coordinate System 局部坐标系也称为模型坐标系或物体坐标系,每个物体都有自身独立的物体坐标系。当物体移动或改变方向

Z_hongli的博客 8179

YOLOv11【第二章:核心模块进阶篇·第28节】DynamicHead动态检测头设计!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1万+

c++ mqtt客户端_物联网安全之MQTT协议安全

大家好,我是银基Tiger Team的BaCde,今天来说说MQTT协议的安全。MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议,由 IBM 发布。由于其轻量、简单、开放和易于实现的特点非常适合需要低功耗和网络带宽有限的IoT场景。比如遥感数据、...

weixin_39580748的博客 583

DRV8311HRRWR直流无刷(BLDC)电机驱动原理图设计

DRV8311HRRWR集成三个MOSFET 半H桥,用于驱动三相无刷直流电机(BLDC),适用于5V、9V、12V或18V直流电源轨或1S至4S电池供电应用。内部集成三个具有集成电流感测功能的电流感测放大器(CSA),可感测BLDC电机的三相电流,从而实现FOC和电流控制系统设计方案。集成保护特性:VM 欠压锁定 (UVLO)、 电荷泵欠压 (CPUV)、过流保护 (OCP)、热警告和热关断 (OTW/OTSD)、故障条件指示引脚 (nFAULT)支持 1.8V、3.3V 和 5V 逻辑输入。

zhusl6688的博客 1228

使用mqtt向web里面插入数据_物联网安全之MQTT协议安全

物联网安全之MQTT协议安全大家好,我是银基Tiger Team的BaCde,今天来说说MQTT协议的安全。MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅方式的消息协议,由 IBM 发布。由于其轻量、简单、开放和易于实现的特点非常适合需要低功耗和网络带宽有限的IoT场...

weixin_39699313的博客 958

高渗透率光伏接入配电网的电压越限与谐波治理:基于VSG构网型控制与SVG+APF联合补偿的Simulink仿真研究

本文针对高渗透率光伏接入配电网引发的电压越限和谐波畸变问题,提出了一种分层递进的综合治理方案。通过建立IEEE 33节点配电网的Simulink仿真模型,首先验证了传统跟网型控制下光伏渗透率提高导致的电压越上限(最高达1.08 p.u.)和系统谐波畸变严重(THD达8.72%)问题。进而提出:1)将部分光伏逆变器改造为构网型VSG控制,利用其无功调压能力与虚拟阻抗技术实现本地治理;2)在关键节点加装SVG+APF联合补偿装置进行全局动态无功补偿与谐波滤除。仿真结果表明,该方案能将节点电压控制在0.94-1.

huanghm88的专栏 578

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

android采用IBM-MQTT协议消息推送。

对于消息推送,一开始还真不知道什么方式比较好,一头雾水,现在回顾总结下资料。 http://zheye.org/asks/4d99a1aafd503c41d700000a 通过上面者也里面的回复,得到一些信息。 1.官方的C2DM,但是只支持android2.2及以上平台的,而且使用的google的服务器。 对于google服务器的问题,网友应该都清楚,天朝的大中华区局域网总是让它不时的给

辣鸡的记录之路 2279

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

鉴源实验室·基于MQTT协议的模糊测试研究

由于不正确处理非UTF-8编码字符的客户端ID或主题名称而导致的漏洞CVE-2020-13932,攻击者利用了Apache ActiveMQ Artemis 2.5.0到2.13.0(MQTT服务器)中的一个漏洞,在服务器接受包含非UTF-8编码字符的客户端ID和主题名称的MQTT数据包。类似地还有与数据类型相关的漏洞,由于变量的不正确初始化,如在CVE-2019-5917中,通过利用Microsoft Azure的MQTT客户端服务中的未指定的向量,进行了拒绝服务攻击。报文的固定报头保留位必须全为0。

TICPSH的博客 1349

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java解析mqtt_物联网安全系列 | MQTT协议安全

MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议,由 IBM 发布。由于其轻量、简单、开放和易于实现的特点非常适合需要低功耗和网络带宽有限的IoT场景。比如遥感数据、汽车、智能家居、智慧城市、医疗医护等。MQTT协议为大量计算能力有限,低带宽、不...

weixin_39865625的博客 494

MQTT 安全解析:构建可靠的物联网系统

物联网安全是物联网发展中每个相关企业都需要重点关注的课题。作为物联网通信协议的事实标准,MQTT协议提供了很多与安全相关的功能特性,以保障物联网系统的安全。

emqx_broker的博客 1177

自定义协议_loT | 基于MQTT协议的智能开关架构设计

作者: @iGuo 我的高中同学最近因为疫情在家,和几个同学合伙开了一批自习室。他们找到我说想要做自习室的无人化管理,分析了需求以后,发现主要是需要做物联网程序,于是动手设计了一些方案,顺便分享给可能需要做loT应用的朋友们拓展思路。注意:本方案是个设计稿,没有经过实践检验,不确定在生产环境是否可靠,请慎用。这个项目的主要需求其实并不复杂,只是需要让用户可以在小程序上控制预约后的自习室座位的灯和柜...

weixin_39881859的博客 817
上一篇: TCP3次握手,4次挥手的过程
下一篇: XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较
iteye_4921
博客等级 码龄8年 25粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值