上篇文章我们介绍了MQTT安全的一些非常基本的概念. 今天的这篇文章将继续深入细节, 从MQTT身份认证开始.
身份认证是MQTT传输层和应用层安全的一部分. 在传输层, TLS可以用客户端证书的方式保证客户端到服务器的身份认证, 并且用验证服务器证书的方式保证服务器到客户端的身份认证. 在应用层, MQTT协议提供用户名和密码的方式进行身份验证. 各种MQTT代理服务器会在用户名密码认证方式之上添加不同的机制去实现. 本文将概述身份认证的一般情况以及MQTT协议本身内置了哪些功能. 后续文章还会继续给出MQTT代理的身份认证方法.
身份认证
也就是说身份认证被用来验证人, 设备或者应用程序确实具备其声称的身份.
旅行这一情境下呈现了上述概念的一个简单例子. 在上飞机之前, 机场安保人员会让旅客出示护照或者身份证. 出示所请求的证件证明作为个人身份. 在这种情况下, 护照将确认该旅客的身份和姓名. 每个人都可以说出旅客的名字, 但是只有旅客本人能出示他的护照并成功完成身份信息的认证.
身份认证其实是一个我们每天都在使用但是确很容易忽视的一个流程. 例如, 登陆计算机需要输入正确的用户名和密码, 用户名其实就是身份信息, 密码用来证明此用户是合法所有者.
MQTT基于用户名密码的认证方式
image用户名是一个以UTF-8编码的字符串, 密码是一个二进制数据流, 二者最长都不得超过65535. MQTT 3.1协议中有一个关于密码最短12个字节的建议, 但是在MQTT V3.1.1中移除了. 并且MQTT V3.1.1也声明没用密码的用户名同样合法. 但是需要注意没有用户名的密码是非法的.
image返回值 / Return Code | 返回值含义 / Return Code Response |
---|---|
0 | 连接成功 |
4 | 连接失败, 用户名或密码错误 |
5 | 连接被拒绝, 未授权 |
客户端设置的用户名和密码会以明文的方式发送给MQTT代理. 这将允许攻击者窃听, 并且获取证书的方法并不复杂. 确保用户名和密码传输百分百安全的唯一方法是使用传输层加密.
这就是MQTT身份认证相关的第一部分, 下一篇文章我们来聊一聊MQTT代理服务器方面如何通过验证客户端的用户名密码或其他属性来实现身份认证的不同方法.
译注
- 本文将Authentication翻译为身份认证