MQTT在多linux主机的TLS加密通讯实现

MQTT在多linux主机的TLS加密通讯实现

环境

  • 局域网主机R3600:Ubuntu20
  • 局域网主机Ubuntu on VMware
  • 公网主机:118.195.183.14

TLS基础

组成

主要分为3类文件,分别为

  1. 证书文件,xxx.crt;其中有种特殊的证书,用于生成证书的证书一般叫ca.crt,certificate authority certificate的简写
  2. 秘钥,xxx.key
  3. 待签名证书,xxx.csr;certificate signing request的简写,一般csr需要发给CA去签名,签名后成为crt
思路
  1. 在服务端主机(这里为公网服务器broker)生成ca.key和ca.crt
  2. 在任意主机(这里同样选择公网服务器broker)生成server.key和server.csr
  3. 在服务端主机(这里为公网服务器broker)使用ca.key和ca.crt对server.csr进行签名生成server.crt
  4. 将server.key、server.crt和ca.crt 3个文件打包发给mqtt server
  5. 上面只对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"替换为了公网主机的公网地址

image-20220818175423480

将生成的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

改好后如下

image-20220818175754782

重新运行broker

结束当前broker进程,并重新启动(也许上面配置文件改完就生效不用重新启动,未验证)

ps -ef | grep mosquitto
sudo kill [mosquitto_pid]
sudo mosquitto -d -c /etc/mosquitto/mosquitto.conf

image-20220818165931591

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

如下现象表示测试成功

image-20220818185843002

image-20220818185900064

image-20220818185909081

注意
  1. 如果脚本里server的证书CN字和域名不一致时会连接错误,需要加–insecure才可以
  2. 公网主机也做client时,需要加–insecure才能连接ok

参考

  1. mosquitto-tls man page | Eclipse Mosquitto
  2. MQTT Host name verification failure (SSL) - Configuration - Home Assistant Community (home-assistant.io)
  3. mosquitto 开启 TLS 问题总结_aggresss的博客-CSDN博客
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值