MQTT在多linux主机的TLS加密通讯实现
文章目录
环境
- 局域网主机R3600:Ubuntu20
- 局域网主机Ubuntu on VMware
- 公网主机:118.195.183.14
TLS基础
组成
主要分为3类文件,分别为
- 证书文件,xxx.crt;其中有种特殊的证书,用于生成证书的证书一般叫ca.crt,certificate authority certificate的简写
- 秘钥,xxx.key
- 待签名证书,xxx.csr;certificate signing request的简写,一般csr需要发给CA去签名,签名后成为crt
思路
- 在服务端主机(这里为公网服务器broker)生成ca.key和ca.crt
- 在任意主机(这里同样选择公网服务器broker)生成server.key和server.csr
- 在服务端主机(这里为公网服务器broker)使用ca.key和ca.crt对server.csr进行签名生成server.crt
- 将server.key、server.crt和ca.crt 3个文件打包发给mqtt server
- 上面只对server侧进行单向验证,如果同时要对client端进行双向验证只需要将步骤234的server换为client即可
多client共用证书
肯定是可以的,不然不可能为这么多client单独生成证书,正常应该是签名好的证书由CA发放给client
过程
使用脚本生成证书
mkdir -p ~/cert
cd ~/cert
vi cert.sh
chmod u+x cert.sh
./cert.sh
cert.sh脚本;注意"/CN=server" 替换为server的IP地址
#!/usr/bin/env bash # When OpenSSL prompts you for the Common Name for each certificate, use different names. # CA key openssl genrsa -out ca.key 2048 # CA csr openssl req -new -subj "/CN=ca" -key ca.key -out ca.csr # CA crt openssl x509 -req -in ca.csr -out ca.crt -signkey ca.key -days 3650 # server key openssl genrsa -out server.key 2048 # server.csr openssl req -new -subj "/CN=server" -key server.key -out server.csr # server.crt openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key \ -CAcreateserial -days 3650 # server.crt verify openssl verify -CAfile ca.crt server.crt # client key openssl genrsa -out client.key 2048 # client.csr openssl req -new -subj "/CN=client" -key client.key -out client.csr # client.crt openssl x509 -req -in client.csr -out client.crt -CA ca.crt -CAkey ca.key \ -CAcreateserial -days 3650 # client.crt verify openssl verify -CAfile ca.crt client.crt
生成过程,其中"/CN=server"替换为了公网主机的公网地址
将生成的ca.crt, client.crt, client.key复制到各个client中备用
修改mosquitto.conf配置文件
sudo vi /etc/mosquitto/mosquitto.conf
新增如下内容
listener 8883 cafile /home/ubuntu/cert/ca.crt certfile /home/ubuntu/cert/server.crt keyfile /home/ubuntu/cert/server.key # one-way or two-way authentication require_certificate true
改好后如下
重新运行broker
结束当前broker进程,并重新启动(也许上面配置文件改完就生效不用重新启动,未验证)
ps -ef | grep mosquitto
sudo kill [mosquitto_pid]
sudo mosquitto -d -c /etc/mosquitto/mosquitto.conf
TLS加密通讯测试
拓扑结构是局域网主机R3600发布消息,局域网主机vm-ubuntu和公网主机VM-0-2-ubuntu订阅消息
mosquitto_pub --cafile ca.crt --cert client.crt --key client.key -h 118.195.183.14 -t hello -m "hello"
mosquitto_sub --cafile ca.crt --cert client.crt --key client.key -h 118.195.183.14 -t hello
mosquitto_sub --cafile ca.crt --cert client.crt --key client.key -t hello --insecure
如下现象表示测试成功
注意
- 如果脚本里server的证书CN字和域名不一致时会连接错误,需要加–insecure才可以
- 公网主机也做client时,需要加–insecure才能连接ok