MQTT协议及安全详解

简介: MQTT协议及安全详解

  1、MQTT概念  

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布,目前最新版本为v3.1.1。MQTT最大的优点在于可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备、移动应用等方面有广泛的应用。

当然,在物联网开发中,MQTT不是唯一的选择,与MQTT互相竞争的协议有XMPP和CoAP协议等,

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量,简单,开放和易于实现的。如:机器与机器(M2M)通信和物联网(loT)。

MQTT 是 IoT 领域的最重要的标准协议之一,广泛用于物联网、车联网、工业物联网、智能家居、智慧城市、电力石油能源等行业。

MQTT 是 AWS IoT Core、 Azure IoT Hub、阿里云物联网平台等顶级云厂商物联网平台标准通信协议,是工业互联网、车联网、智能家居等各个行业以及诸多网关协议上云的首选协议。

EMQX 作为全球最热门、最成熟的 MQTT Broker 之一,提供了「随处运行,无限连接,任意集成」云原生分布式物联网接入平台,一体化的分布式 MQTT 消息服务和强大的 IoT 规则引擎,为高可靠、高性能的物联网实时数据移动、处理和集成提供动力,助力企业快速构建关键业务的 IoT 平台与应用。

 

2、设备网络构成

设备主要有三种角色:代理(broker)、发布者(publisher)、订阅者(subscriber)。

    • 代理:服务端,是传输的桥梁,一个网络中通常只有一个。负责处理客户端的连接、订阅、发布。
    • 发布者:客户端,负责发布消息到代理,代理将数据转发给订阅者。
    • 订阅者:客户端,负责接收代理的转发消息

    3、MQTT协议原理

    3.1 MQTT协议实现方式

    实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish),代理(Broker)(服务器),订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者

    MQTT 传输的消息分为:主题(Topic) 和负载(payload)两部分

      1)Topic,可以理解为消息类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);

      2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容

    3.2网络传输与应用消息

    MQTT会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的,无损的,基于字节流的双向传输

    当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(Qos)和主题名(Topic)相关连

    3.3 MQTT客户端

    一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:

      1)发布其他客户端可能会订阅的信息

      2)订阅其他客户端发布的消息

      3)退订或删除应用程序的消息

      4)断开与服务器连接

    3.4 MQTT服务器

    MQTT服务器以称为“消息代理”(Broker),可以是一个应用程序或一台设备,它是位于消息发布者和订阅者之间,它可以:

      1)接受来自客户的网络连接;

      2)接受客户发布的应用消息;

      3)处理来自客户端的订阅和退订请求

      4)向订阅的客户转发应用程序消息

    3.5 MQTT协议中的订阅,主题,会话

    (1)订阅(Subscription)

    订阅包含主题筛选器(Topic Filter)和最大服务质量(Qos)。订阅会与一个会话(session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器

    (2)会话(session)

    每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在一个网络之间,也可能在客户端和服务器之间跨越多个连接的网络连接

    (3)主题(Topic Name)

    连接到一个应用程序消息的标签,该标签与服务器的订阅匹配。服务器会将消息发送给订阅所匹配标签的每个客户端

    (4)主题筛选器(Topic Filter)

    一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题

    (5)负载(Payload)

    消息订阅者所具体接收的内容

    3.6 MQTT协议中的方法

    MQTT协议中定义了一些方法(也被称为动作),来表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。主要方法有:

      1)Connect,等待与服务器建立连接

      2)Disconnect,等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话

      3)Subscribe,等待完成订阅

      4)UnSubscribe,等待服务器取消客户端的一个或多个topics订阅

      5)Publish,MQTT客户端发送消息请求,发送完成后返回应用程序线程

    3.7 连接保活心跳机制(Keep Alive Timer)

    MQTT客户端可以设置一个心跳间隔时间(Keep Alive Timer),表示在每个心跳间隔时间内发送一条消息。如果在这个时间周期内,没有业务数据相关的消息,客户端会发一个PINGREQ消息,相应的,服务器会返回一个PINGRESP消息进行确认。如果服务器在一个半(1.5)心跳间隔时间周期内没有收到来自客户端的消息,就会断开与客户端的连接。心跳间隔时间最大值大约可以设置为18个小时,0值意味着客户端不断开。

    3.8 MQTT的安全

    由于MQTT运行于TCP层之上并以明文方式传输,这就相当于HTTP的明文传输,使用Wireshark可以完全看到MQTT发送的所有消息,消息指令一览无遗。

    这样可能会产生以下风险:

    设备可能会被盗用;

    客户端和服务端的静态数据可能是可访问的(可能会被修改);

    协议行为可能有副作用(如计时器攻击);

    拒绝服务攻击;

    通信可能会被拦截、修改、重定向或者泄露;

    虚假控制报文注入。

    作为传输协议,MQTT仅关注消息传输,提供合适的安全功能是开发者的责任。安全功能可以从三个层次来考虑——应用层、传输层、网络层。

    应用层:在应用层上,MQTT提供了客户标识(Client Identifier)以及用户名和密码,可以在应用层验证设备。

    传输层:类似于HTTPS,MQTT基于TCP连接,也可以加上一层TLS,传输层使用TLS加密是确保安全的一个好手段,可以防止中间人攻击。客户端证书不但可以作为设备的身份凭证,还可以用来验证设备。

    网络层:如果有条件的话,可以通过拉专线或者使用VPN来连接设备与MQTT代理,以提高网络传输的安全性。

    认证

    MQTT支持两种层次的认证:

    应用层:MQTT支持客户标识、用户名和密码认证;

    传输层:传输层可以使用TLS,除了加密通讯,还可以使用X509证书来认证设备。

    客户标识

    MQTT客户端可以发送最多65535个字符作为客户标识(Client Identifier),一般来说可以使用嵌入式芯片的MAC地址或者芯片序列号。虽然使用客户标识来认证可能不可靠,但是在某些封闭环境或许已经足够了。

    用户名和密码

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

    用户名及密码的认证使用起来非常方便,不过由于它们是以明文形式传输,所以使用抓包工具就可以轻易的获取。

    一般来说,使用客户标识、用户名和密码已经足够了,比如支持MQTT协议连接的OneNET云平台,就是使用了这三个字段作为认证。如果感觉还不够安全,还可以在传输层进行认证。

    在传输层认证

    在传输层认证是这样的:MQTT代理在TLS握手成功之后可以继续发送客户端的X509证书来认证设备,如果设备不合法便可以中断连接。使用X509认证的好处是,在传输层就可以验证设备的合法性,在发送CONNECT消息之前便可以阻隔非法设备的连接,以节省后续不必要的资源浪费。而且,MQTT协议运行在使用TLS时,除了提供身份认证,还可以确保消息的完整性和保密性。

     

    3.9 选择用户数据格式

    MQTT协议只实现了传送消息的格式,并没有限制用户协议需要按照一定的风格,因此在MQTT协议之上,我们需要定义一套自己的通信协议。比如说,发布者向设备发布一条打开消息,设备可以回复一个消息并携带返回码,这样的消息格式是使用二进制、字符串还是JSON格式呢?下面就简单做个选型参考。

    十六进制/二进制

    MQTT原本就是基于二进制实现的,所以用户协议使用二进制实现是一个不错的选择。虽然失去了直观的可读性,但可以将流量控制在非常小。其实对于单片机开发者来说十六进制并不陌生,因为单片机寄存器都是以位来操作的,芯片间通信也会使用十六进制/二进制。而对于没有单片机开发经验的工程师来说,十六进制/二进制可能就太原始了。下面我们继续看看还有没有其他方案。

    字符串

    对单片机开发者来说,字符串也是一个选择。比如通过串口传输的AT指令就是基于字符串通信的。使用字符串方便了人阅读,但是对高级语言开发者来说,字符串依旧不是最佳选择,恐怕键值对(Key-Value)才是最优形式。

    JSON

    JSON中文全称是JavaScript对象标记语言,在这门语言中,一切都是对象。因此,任何支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。

    XML

    MQTT协议只负责通信部分,用户协议可以自己选择,当然也可以选择复杂又冗长的XML格式

     

    详细内容参考:MQTT Version 5.0


    📢文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群💪💪💪

    📢创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒

    📢你的支持和鼓励是我创作的动力❗❗❗  

    官网Doker 多克;官方旗舰店官方旗舰店  全品优惠

    相关实践学习
    RocketMQ一站式入门使用
    从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
    消息队列 MNS 入门课程
    1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
    目录
    相关文章
    |
    5天前
    |
    消息中间件 物联网 网络性能优化
    MQTT常见问题之MQTT不支持5.0的协议如何解决
    MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
    |
    5天前
    |
    传感器 网络协议 物联网
    在Linux中搭建Mosquitto MQTT协议消息服务端并结合内网穿透工具实现公网访问
    Mosquitto是一个开源的消息代理,它实现了MQTT协议版本3.1和3.1.1。它可以在不同的平台上运行,包括Windows、Linux、macOS等。mosquitto可以用于物联网、传感器、移动应用程序等场景,提供了一种轻量级的、可靠的、基于发布/订阅模式的消息传递机制。
    |
    5天前
    |
    网络协议 物联网 网络性能优化
    物联网网络协议-MQTT协议的使用
    物联网网络协议-MQTT协议的使用
    156 2
    |
    7月前
    |
    Java 物联网 Maven
    Spring Boot 如何集成 MQTT,实现基于 MQTT 协议的消息传递?
    Spring Boot 如何集成 MQTT,实现基于 MQTT 协议的消息传递?
    1209 2
    Spring Boot 如何集成 MQTT,实现基于 MQTT 协议的消息传递?
    |
    5天前
    |
    物联网 Go 网络性能优化
    使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式
    使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式【1月更文挑战第21天】【1月更文挑战第104篇】
    145 1
    |
    3天前
    |
    传感器 网络协议 Ubuntu
    MQTT协议与EMQ
    MQTT协议与EMQ
    |
    5天前
    |
    监控 网络性能优化 网络安全
    【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
    【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
    38 1
    |
    7月前
    |
    网络协议 物联网 开发者
    详细介绍 MQTT 的工作原理,包括 MQTT 协议的特点、核心概念以及消息传递的流程
    详细介绍 MQTT 的工作原理,包括 MQTT 协议的特点、核心概念以及消息传递的流程
    1152 1
    |
    5天前
    |
    物联网 Linux 开发工具
    MQTT协议接入问题之连接失败如何解决
    MQTT接入是指将设备或应用通过MQTT协议接入到消息服务器,以实现数据的发布和订阅;本合集着眼于MQTT接入的流程、配置指导以及常见接入问题的解决方法,帮助用户实现稳定可靠的消息交换。
    162 2
    |
    5天前
    |
    JSON 物联网 开发工具
    MQTT协议问题之如何搭建物联网空调的服务器
    MQTT协议是一个轻量级的消息传输协议,设计用于物联网(IoT)环境中设备间的通信;本合集将详细阐述MQTT协议的基本原理、特性以及各种实际应用场景,供用户学习和参考。
    85 1