MQTT 安全通信 SSL 双向认证 | 学习笔记

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 快速学习 MQTT 安全通信 SSL 双向认证

开发者学堂课程【嵌入式之 RFID 开发与应用2020版:MQTT 安全通信 SSL 双向认证】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/665/detail/11177


MQTT 安全通信 SSL 双向认证

内容简介:

一、MQTT 通讯过程的安全保障机制的分层

二、传输层的加密

三、实现双向认证

 

上节课学习了非匿名登陆,也就是服务器因为它可以通过账户,同时配置文件也是支持的,配置文件里必须指定账户信息所在的路径password_file/etc/mosquitto/passwd.conf。这样就可以用账户登录,没有账户就无法登陆需要授权,但是数据通信内容依然是明文,可以用 wear shock。后来要用一种更安全的方式 就是加密通信。

 

一、MQTT 通讯过程的安全保障机制的分层

其实整个 MQTT 的通讯过程,它的安全保障机制,大致上可以分为三层,首先第一层,就是刚刚讲的可以通过建立用户名密码就建立账号来管理授权用户,第二,就是所谓的传输层的加密,TLS 就是典型的基于传输层的一种加密法。它不仅可以在传输的时间加密,同时它也本身实现了身份的验证,因为里面有证书,所以不仅保证了用户的安全,也保证了数据的安全,第三种,就是所谓建立在网络层,通过专用的 VPN 网络也可以实现安全的东西,但是第三种的成本就会更高一些,因为要去购买 VPN 专线。

 

二、传输层的加密

那么接下来主要就是看第二种方式,通过 TLS 加密,TLS 加密之前,首先要检查一下系统是不是支持 openssl。其实正常情况下这个 openssl 用的是非常多的,所以说,大多数电脑基本上装完理论上默认都是有的,如果实在是没有的话,就通过 sudo apt-get install openssl 去安装一下,下面的 sudo apt-get install libss1-dev 是装它的一些开发用到的文件,库之类的。装完之后,写了一个脚本,当然在网上可以去查,可以一条一条命令去敲,这样使用起来不方便。把 make_ssl.sh和rm_ssl.sh 这两个文件,可以拷到虚拟机里面。在 MQTT 这里,建一个文件夹。把make_ssl.sh 和 rm_ssl.sh 这个两个文件拷过来,主要是用第一个 make_ssl.sh 文件,其实这里面的证书用的是 x509 标准,那么有关 openssl 涉及到的一些加密、证书,后期会去开专题介绍,专门去讲数据安全有关的,有时候 SSL 有时候 TLS 数字签名数字证书,还有公钥私钥哈希算法,还有网络通讯里面的 cakey 之类的,所以今天不单独去讲。

image.png

打开了之后第一步就是要查看 IP,把里面默认的 IP192.168.1.13 改为服务器的IP10.013.252。因为这是服务器下发给客户端的证书。

这就是第一步改变 IP,第二步,就是直接去运行脚本就可以了,执行 make _ssl.sh。随后下一个脚本,也可以在网上去找。生成的证书,首先 ca 证书就 ca.crt ca.key 在这个目录下,客户端的在 edu:ssl$ ls client , 服务器的在 server.crt  server.key,这样很方便,当然名字就是代表的证书密钥,里面的格式用的是 PEM,当然还一种二进制的方式,一般情况都能看到证书,当然看到的也就是一堆字符串。

image.png

生产好之后,接下来还要再配置服务器,因为服务器必须要支持证书才行,所以依然要打开 etc/mosquitto/mosquitto.conf,然后在后面继续添加这三行,第一行cafile /home/edu/debug/mqtt/ssl/ca/ca.crt,第二行 certfile /home/edu/debug/mqtt/ssl/server/server.crt,第三行 keyfile /home/edu/debug/mqtt/ssl/server/server.key。先将这三行复制,因为如果有格式的话复制进去可能会出错。

先看一下路径是否正确,路径为 /home/edu/debug/mqtt/ssl ,路径一定要正确。接下来打开文件,三句话分别指定了 ca 的证书,还有密钥所在的位置,这是服务器就配置好了。

image.png

接下来开始运行一个服务器 mosquitto-c/etc/mosquitto/mosquitto.conf。Mosquitto_sub -t temp-v -d -u  hg -p 111111 是上一次通过非匿名登录去订阅了一个消息,现在也是一样的,通过非匿名去登录去连接服务器,发送 connect,根本就无法连接,一直在提示 SSL,一直提示错误,连不上是因为此时的登录是需要证书认证。

image.png

证书的决定可以通过 cafile /home/edu/debug/mqtt/ssl/ca/ca.crt 参数。Cafile 指定证书所在的路径,这个路径就是刚才生成的全路径。同样连接失败,当出现连接失败的时候 IP 就有问题,它是 127,但是之前填的 IP 是 192。

image.png

注意一下,因为这个地方是通过回环过去的,所以必须得把IP和端口再指定一下,因为如果不指定跟密钥生成的不能匹配。

image.png

这时就连接上了,这时去发布端发布一个消息,发布是失败的,连接也不成功。因为同样的道理需要去携带证书,它已经有 IP,所以说可以不加,IP 也有了,它还是会失败,其实这个地方有一个小问题就是服务器的特点,它就是不仅要有 IP,还要有端口,虽然这个端口是默认都知道的端口,但还是要加,把IP和端口全加上发布的消息才会真正的订阅到。

image.png

这种通信其实只用到了 ca 这个证书,也就是只是服务器完成的验证,所以把这种验证又叫做单项的验证,那么双向验证就是除了服务器验证以外,客户端也要验证。

 

三、实现双向认证

怎样实现双向验证,双向验证会使得通信更加的可靠,接下来,把这个双向认证加上,双向认证需要再修改配置文件,再增加一个配置,就是 require_certificate ture 和 use_identity_as_username ture。

重新再复制一下,然后加到配置的后面。

image.png

加完之后重新启动服务器,启动完之后,刚才用这种方法证书也有了端口也有了,之前是成功的,但现在又失败了,而且之前这个错误是报到服务端,现在这个错误是报到客户端。

image.png

服务端通过了,但是客户端没有通过,所以接下来在客户端也要去验证,所以要用客户端的密钥。就必须把密钥也加上,用 cert 去指定,输入cert/home/edu/debug/mqtt/ssl/client.crt

一定要将内容写全,第二个是叫做--key/home/edu/debug/mqtt/ssl/client/client.key这个订阅连接就成功了。

image.png

发布端也是同样的道理,比如去发布肯定发不了,因为开启了双向认证,home/edu/debug/mqtt/ssl/client/client.key和 /home/edu/debug/mqtt/ssl/ca/ca.crt 都是客户端,所以它们的证书和密钥实际上是同一个,所以就把它直接复制过来实施发布。

这就是所谓的双向验证,那么经过刚才讲的安全通信里面的三种方法,给大家实现了前两种方法,那么最后一种花钱的,可以自己去做,如果既采用了 VPN 又采用了前两种的话,那 MQTT 的整个通讯那将是非常安全的,可以放心的去使用,后面会具体讲 mosquitto 的移植。

相关实践学习
消息队列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
相关文章
|
6月前
|
安全 网络安全
如何给网站添加ssl安全证书
如何给网站添加ssl安全证书
|
2月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
3月前
|
消息中间件 Kafka 数据安全/隐私保护
RabbitMQ异步通信详解
RabbitMQ异步通信详解
102 16
|
4月前
|
消息中间件 安全 Java
构建基于RabbitMQ的安全消息传输管道
【8月更文第28天】在分布式系统中,消息队列如RabbitMQ为应用间的数据交换提供了可靠的支持。然而,随着数据的敏感性增加,确保这些消息的安全传输变得至关重要。本文将探讨如何在RabbitMQ中实施一系列安全措施,包括加密通信、认证和授权机制,以保护敏感信息。
102 1
|
4月前
|
物联网 C# Windows
看看如何使用 C# 代码让 MQTT 进行完美通信
看看如何使用 C# 代码让 MQTT 进行完美通信
627 0
|
4月前
|
物联网 网络性能优化 Python
"掌握MQTT协议,开启物联网通信新篇章——揭秘轻量级消息传输背后的力量!"
【8月更文挑战第21天】MQTT是一种轻量级的消息传输协议,以其低功耗、低带宽的特点在物联网和移动应用领域广泛应用。基于发布/订阅模型,MQTT支持三种服务质量级别,非常适合受限网络环境。本文详细阐述了MQTT的工作原理及特点,并提供了使用Python `paho-mqtt`库实现的发布与订阅示例代码,帮助读者快速掌握MQTT的应用技巧。
93 0
|
4月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
524 0
|
5月前
|
安全 网络协议 网络安全
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
|
5月前
|
网络安全
嗯… 无法访问此页面43.139.210.211 花了太长时间进行响应,无法连接宝塔,是服务器内的宝塔面板开启了ssl的验证,但是没有绑定证书,所以被拦截,关闭宝塔面板的ssl访问认证恢复正常
嗯… 无法访问此页面43.139.210.211 花了太长时间进行响应,无法连接宝塔,是服务器内的宝塔面板开启了ssl的验证,但是没有绑定证书,所以被拦截,关闭宝塔面板的ssl访问认证恢复正常