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版:基础消息收发功能体验
    本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
    消息队列 MNS 入门课程
    1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
    目录
    相关文章
    |
    7月前
    |
    消息中间件 物联网 网络性能优化
    MQTT常见问题之MQTT不支持5.0的协议如何解决
    MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
    |
    21天前
    |
    数据采集 传感器 监控
    多协议网关BL110钡铼6路RS485转MQTT协议云网关
    BL110钡铼6路RS485转MQTT协议云网关是一款高性能、易配置的工业级设备,适用于各种需要远程监控和数据采集的物联网应用场景。通过将传统RS485设备的数据转换为MQTT协议并上传至云平台,实现了设备的远程管理和智能控制,极大地提升了系统的管理效率和响应速度。
    26 2
    |
    2月前
    |
    网络协议 物联网 网络性能优化
    物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
    【10月更文挑战第18天】本文介绍了物联网领域中四种主要的通信协议:MQTT、CoAP、RESTful/HTTP和XMPP,分别从其特点、应用场景及优缺点进行了详细对比,并提供了简单的示例代码。适合开发者根据具体需求选择合适的协议。
    72 5
    |
    3月前
    |
    消息中间件 监控 物联网
    MQTT协议对接及RabbitMQ的使用记录
    通过合理对接MQTT协议并利用RabbitMQ的强大功能,可以构建一个高效、可靠的消息通信系统。无论是物联网设备间的通信还是微服务架构下的服务间消息传递,MQTT和RabbitMQ的组合都提供了一个强有力的解决方案。在实际应用中,应根据具体需求和环境进行适当的配置和优化,以发挥出这两个技术的最大效能。
    208 0
    |
    7月前
    |
    传感器 网络协议 Ubuntu
    MQTT协议与EMQ
    MQTT协议与EMQ
    187 0
    |
    4月前
    |
    消息中间件 安全 Java
    构建基于RabbitMQ的安全消息传输管道
    【8月更文第28天】在分布式系统中,消息队列如RabbitMQ为应用间的数据交换提供了可靠的支持。然而,随着数据的敏感性增加,确保这些消息的安全传输变得至关重要。本文将探讨如何在RabbitMQ中实施一系列安全措施,包括加密通信、认证和授权机制,以保护敏感信息。
    113 1
    |
    4月前
    |
    物联网 C# 智能硬件
    智能家居新篇章:WPF与物联网的智慧碰撞——通过MQTT协议连接与控制智能设备,打造现代科技生活的完美体验
    【8月更文挑战第31天】物联网(IoT)技术的发展使智能家居设备成为现代家庭的一部分。通过物联网,家用电器和传感器可以互联互通,实现远程控制和状态监测等功能。本文将探讨如何在Windows Presentation Foundation(WPF)应用中集成物联网技术,通过具体示例代码展示其实现过程。文章首先介绍了MQTT协议及其在智能家居中的应用,并详细描述了使用Wi-Fi连接方式的原因。随后,通过安装Paho MQTT客户端库并创建MQTT客户端实例,演示了如何编写一个简单的WPF应用程序来控制智能灯泡。
    151 0
    |
    4月前
    |
    物联网 网络性能优化 Python
    "掌握MQTT协议,开启物联网通信新篇章——揭秘轻量级消息传输背后的力量!"
    【8月更文挑战第21天】MQTT是一种轻量级的消息传输协议,以其低功耗、低带宽的特点在物联网和移动应用领域广泛应用。基于发布/订阅模型,MQTT支持三种服务质量级别,非常适合受限网络环境。本文详细阐述了MQTT的工作原理及特点,并提供了使用Python `paho-mqtt`库实现的发布与订阅示例代码,帮助读者快速掌握MQTT的应用技巧。
    95 0
    |
    6月前
    |
    数据采集 监控 物联网
    MQTT协议在智能制造中的应用案例与效益分析
    【6月更文挑战第8天】MQTT协议在智能制造中的应用案例与效益分析
    185 1
    |
    6月前
    |
    消息中间件 存储 RocketMQ
    消息队列 MQ产品使用合集之Remoting协议是否可以直接和proxy交互的吗
    阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。

    热门文章

    最新文章