开发者学堂课程【嵌入式之 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 之类的,所以今天不单独去讲。
打开了之后第一步就是要查看 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,当然还一种二进制的方式,一般情况都能看到证书,当然看到的也就是一堆字符串。
生产好之后,接下来还要再配置服务器,因为服务器必须要支持证书才行,所以依然要打开 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 的证书,还有密钥所在的位置,这是服务器就配置好了。
接下来开始运行一个服务器 mosquitto-c/etc/mosquitto/mosquitto.conf。Mosquitto_sub -t temp-v -d -u hg -p 111111 是上一次通过非匿名登录去订阅了一个消息,现在也是一样的,通过非匿名去登录去连接服务器,发送 connect,根本就无法连接,一直在提示 SSL,一直提示错误,连不上是因为此时的登录是需要证书认证。
证书的决定可以通过 cafile /home/edu/debug/mqtt/ssl/ca/ca.crt 参数。Cafile 指定证书所在的路径,这个路径就是刚才生成的全路径。同样连接失败,当出现连接失败的时候 IP 就有问题,它是 127,但是之前填的 IP 是 192。
注意一下,因为这个地方是通过回环过去的,所以必须得把IP和端口再指定一下,因为如果不指定跟密钥生成的不能匹配。
这时就连接上了,这时去发布端发布一个消息,发布是失败的,连接也不成功。因为同样的道理需要去携带证书,它已经有 IP,所以说可以不加,IP 也有了,它还是会失败,其实这个地方有一个小问题就是服务器的特点,它就是不仅要有 IP,还要有端口,虽然这个端口是默认都知道的端口,但还是要加,把IP和端口全加上发布的消息才会真正的订阅到。
这种通信其实只用到了 ca 这个证书,也就是只是服务器完成的验证,所以把这种验证又叫做单项的验证,那么双向验证就是除了服务器验证以外,客户端也要验证。
三、实现双向认证
怎样实现双向验证,双向验证会使得通信更加的可靠,接下来,把这个双向认证加上,双向认证需要再修改配置文件,再增加一个配置,就是 require_certificate ture 和 use_identity_as_username ture。
重新再复制一下,然后加到配置的后面。
加完之后重新启动服务器,启动完之后,刚才用这种方法证书也有了端口也有了,之前是成功的,但现在又失败了,而且之前这个错误是报到服务端,现在这个错误是报到客户端。
服务端通过了,但是客户端没有通过,所以接下来在客户端也要去验证,所以要用客户端的密钥。就必须把密钥也加上,用 cert 去指定,输入cert/home/edu/debug/mqtt/ssl/client.crt
。
一定要将内容写全,第二个是叫做--key/home/edu/debug/mqtt/ssl/client/client.key
这个订阅连接就成功了。
发布端也是同样的道理,比如去发布肯定发不了,因为开启了双向认证,home/edu/debug/mqtt/ssl/client/client.key
和 /home/edu/debug/mqtt/ssl/ca/ca.crt 都是客户端,所以它们的证书和密钥实际上是同一个,所以就把它直接复制过来实施发布。
这就是所谓的双向验证,那么经过刚才讲的安全通信里面的三种方法,给大家实现了前两种方法,那么最后一种花钱的,可以自己去做,如果既采用了 VPN 又采用了前两种的话,那 MQTT 的整个通讯那将是非常安全的,可以放心的去使用,后面会具体讲 mosquitto 的移植。