MQTT 5.0 报文解析 06:AUTH

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: MQTT 5.0 引入了增强认证特性,它使 MQTT 除了简单密码认证和 Token 认证以外,还能够支持质询/响应风格的认证。为了实现这一点,它在原先 CONNECT 和 CONNACK 报文的基础上,又引入了 AUTH 报文来实现任意多次的认证数据交换,以支持各种不同类型的认证机制,例如 SCRAM、Kerberos 认证等等。

欢迎阅读 MQTT 5.0 报文系列 的最后一篇文章。在上一篇中,我们已经介绍了 MQTT 5.0 的 DISCONNECT 报文。现在,我们将介绍 MQTT 中的最后一个控制报文:AUTH。

MQTT 5.0 引入了增强认证特性,它使 MQTT 除了简单密码认证和 Token 认证以外,还能够支持质询/响应风格的认证。为了实现这一点,它在原先 CONNECT 和 CONNACK 报文的基础上,又引入了 AUTH 报文来实现任意多次的认证数据交换,以支持各种不同类型的认证机制,例如 SCRAMKerberos) 认证等等。

一次典型的增强认证的报文交互流程如下:

Enhanced Authentication.png

关于增强认证的详细介绍,可以参考 《MQTT 5.0 中的安全认证机制:增强认证介绍》。本文我们将主要介绍在增强认证中至关重要的 AUTH 报文。

AUTH 报文示例

由于目前没有支持增强认证特性的 MQTT 客户端,所以我们直接以图示的方式来展示一个典型的 AUTH 报文,里面包含了 AUTH 报文中最重要的两个属性,即认证方法(Authentication Method)和认证数据(Authentication Data):

AUTH Packet.png

接下来,我们将依次介绍这些字段的含义。

AUTH 报文结构

固定报头

固定报头中首字节高 4 位的报文类型字段的值为 15(0b1111),低 4 位全部为 0,表示这是一个 AUTH 报文。

Fixed Header.png

可变报头

AUTH 报文的可变报头按顺序包含以下字段:

  • 原因码(Reason Code):一个单字节的无符号整数,AUTH 报文只有 3 个可用的原因码,它们都用于控制认证流程,分别是:
Value Reason Code Name Sent By Description
0x00 Success 服务端 认证成功,只会在重新认证成功时由服务端返回,如果是连接时的首次认证成功,服务端将返回 CONNACK 报文。
0x18 Continue authentication 客户端、服务端 指示对端继续下一步认证。
0x19 Re-authenticate 客户端 客户端可以在一个连接内随时发起重新认证,重新认证期间消息可以正常收发。
  • 属性(Properties):下表列出了 AUTH 报文的所有可用属性。
Identifier Property Name Type Description
0x15 Authentication Method UTF-8 编码的字符串 认证方法是一个 UTF-8 编码的字符串,用于指示本次认证所使用的认证机制,它可以是 SCRAM-SHA-1 这类已注册的 SASL 机制,也可以是客户端和服务端协商好的任意名称。一旦在 CONNECT 报文中确定了认证方法,那么后续的 AUTH、CONNACK 报文都不可以对其进行变更。
0x16 Authentication Data 二进制数据(由最前面的双字节整数来指示后续的字节数量) 用于承载认证需要的数据,数据的格式与内容由认证方法决定。
0x1F Reason String UTF-8 编码的字符串 表示返回此响应的原因,它可以是任意的内容,由发送端决定,但最好是人类易读的。
0x26 User Property UTF-8 字符串对 用于在报文中附加用户自定义的信息。一个报文中可以包含多个用户属性,即使它们的名字相同。

有效载荷

AUTH 报文不包含有效载荷。

总结

AUTH 报文是实现任意次数认证数据交换的核心,也使得 MQTT 的增强认证能够支持各种不同的认证机制。像 SCRAM 认证、Kerberos 认证,都能提供比简单密码认证更高的安全保障,目前 EMQX 已经支持了其中的 SCRAM 认证

现在,我们已经介绍了 MQTT 中的所有控制报文类型,MQTT 作为一个二进制协议,允许我们传输任意格式的应用消息。但相应地,我们也需要严格地按照协议规范来编码和解析 MQTT 报文,否则就可能造成协议错误。

当我们遇到问题时,可以优先查看对端返回的响应报文中的 Reason Code,它可以指明大部分的错误原因。而当一些嵌入式设备上的端侧 SDK 实现不佳无法直接给出 Reason Code 时,我们可以尝试网络抓包来查看报文中的 Reason Code,此时我们可以借助 Wireshark,避免自己人工解析。

EMQX 作为被广泛使用的可扩展、高可用的 MQTT Broker,也提供了一个方便用户排查问题的 日志追踪 功能,它可以记录下指定 Client ID、主题、IP 的所有相关日志,包括报文收发日志。所以我们可以用它来分析客户端的行为是否异常,例如是否正确地响应了 PUBACK,是否重复发送了连接报文等等。

相关实践学习
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
目录
相关文章
EMQ
|
19天前
|
运维 Linux 网络性能优化
MQTT 5.0 报文解析 05:DISCONNECT
在 MQTT 中,客户端和服务端可以在断开网络连接前向对端发送一个 DISCONNECT 报文,来指示连接关闭的原因。客户端发送的 DISCONNECT 报文还可以影响服务端在连接断开后的行为,例如是否发送遗嘱消息,是否更新会话过期间隔。
EMQ
26 0
MQTT 5.0 报文解析 05:DISCONNECT
EMQ
|
1月前
|
Linux 网络性能优化
MQTT 5.0 报文解析 03:SUBSCRIBE 与 UNSUBSCRIBE
在 MQTT 中,SUBSCRIBE 报文用于发起订阅请求,SUBACK 报文用于返回订阅结果。而 UNSUBSCRIBE 和 UNSUBACK 报文则在取消订阅时使用。相比于取消订阅,订阅操作更加常用。不过在本文中,我们仍然会一并介绍订阅与取消订阅报文的结构与组成。
EMQ
264 3
MQTT 5.0 报文解析 03:SUBSCRIBE 与 UNSUBSCRIBE
|
2天前
|
消息中间件 自然语言处理 负载均衡
RabbitMQ揭秘:轻量级消息队列的优缺点全解析
**RabbitMQ简介** RabbitMQ是源自电信行业的消息中间件,支持AMQP协议,提供轻量、快速且易于部署的解决方案。它拥有灵活的路由配置,广泛的语言支持,适用于异步处理、负载均衡、日志收集和微服务通信等场景。然而,当面临大量消息堆积或高吞吐量需求时,性能可能会下降,并且扩展和开发成本相对较高。
15 0
EMQ
|
27天前
|
开发工具
MQTT 5.0 报文解析 04:PINGREQ 与 PINGRESP
除了用于连接、发布和订阅的控制报文,MQTT 还有一类报文用于在客户端和服务端之间模拟心跳,以达到保持连接的目的,它们分别是 PINGREQ 报文和 PINGRESP 报文,我们通常也会称它们为心跳报文。
EMQ
148 0
MQTT 5.0 报文解析 04:PINGREQ 与 PINGRESP
|
1天前
|
消息中间件 Java 双11
RocketMQ:揭秘电商巨头背后的消息队列秘密
**RocketMQ概览:**高性能分布式消息队列,适用于有序消息、事务处理、流计算、消息推送、日志处理及Binlog分发。在双11等高流量场景下证明了其性能、稳定性和低延迟。Java开发,利于扩展,性能超RabbitMQ,支持死信队列,但可能有集成兼容性问题。适合Java开发者,为电商等场景优化,每秒处理大量消息。
20 3
RocketMQ:揭秘电商巨头背后的消息队列秘密
|
8天前
|
消息中间件 测试技术 开发工具
消息队列 MQ操作报错合集之收到"WARN RocketmqClient - consumeMessage Orderly return"警告,是什么原因
在使用消息队列MQ时,可能会遇到各种报错情况。以下是一些常见的错误场景、可能的原因以及解决建议的汇总:1.连接错误、2.消息发送失败、3.消息消费报错、4.消息重试与死信处理、5.资源与权限问题、6.配置错误、7.系统资源限制、8.版本兼容性问题。
|
8天前
|
消息中间件 设计模式 网络安全
消息队列 MQ操作报错合集之broker启用controller配置时,遇到报错,是什么导致的
在使用消息队列MQ时,可能会遇到各种报错情况。以下是一些常见的错误场景、可能的原因以及解决建议的汇总:1.连接错误、2.消息发送失败、3.消息消费报错、4.消息重试与死信处理、5.资源与权限问题、6.配置错误、7.系统资源限制、8.版本兼容性问题。
|
8天前
|
消息中间件 Java 测试技术
消息队列 MQ操作报错合集之设置了setKeepAliveInterval(1)但仍然出现客户端未连接,该怎么解决
在使用消息队列MQ时,可能会遇到各种报错情况。以下是一些常见的错误场景、可能的原因以及解决建议的汇总:1.连接错误、2.消息发送失败、3.消息消费报错、4.消息重试与死信处理、5.资源与权限问题、6.配置错误、7.系统资源限制、8.版本兼容性问题。
|
8天前
|
消息中间件 Apache RocketMQ
消息队列 MQ操作报错合集之设置了controller后,有一主一从,但只显示一个,该怎么解决
在使用消息队列MQ时,可能会遇到各种报错情况。以下是一些常见的错误场景、可能的原因以及解决建议的汇总:1.连接错误、2.消息发送失败、3.消息消费报错、4.消息重试与死信处理、5.资源与权限问题、6.配置错误、7.系统资源限制、8.版本兼容性问题。
|
8天前
|
消息中间件 网络安全 网络虚拟化
消息队列 MQ操作报错合集之如何实现公网访问内网RocketMQ集群
在使用消息队列MQ时,可能会遇到各种报错情况。以下是一些常见的错误场景、可能的原因以及解决建议的汇总:1.连接错误、2.消息发送失败、3.消息消费报错、4.消息重试与死信处理、5.资源与权限问题、6.配置错误、7.系统资源限制、8.版本兼容性问题。

相关产品

  • 云消息队列 MQ
  • 推荐镜像

    更多