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的博客-优快云博客
### mqtt.fx 使用指南 mqtt.fx 是一款用于测试和开发 MQTT 协议的客户端工具,广泛应用于物联网(IoT)领域。以下是关于 mqtt.fx 的使用指南及相关信息。 #### 1. mqtt.fx 简介 mqtt.fx 是一个开源的、跨平台的 MQTT 客户端工具,支持种操作系统,包括 Windows、Linux 和 macOS。它提供了友好的图形用户界面(GUI),便于开发者快速连接到 MQTT Broker 并进行消息发布与订阅操作[^2]。 #### 2. 安装 mqtt.fx mqtt.fx 的安装过程简单直接: - 访问 mqtt.fx 的官方网站或 GitHub 仓库下载最新版本。 - 根据操作系统选择合适的安装包并完成安装。 - 安装完成后,启动 mqtt.fx 客户端。 #### 3. 配置 mqtt.fx 连接到 MQTT Broker 要使用 mqtt.fx 连接到 MQTT Broker,需要进行以下配置: - **Broker 地址**:输入 MQTT Broker 的主机名或 IP 地址。 - **端口号**:通常为 1883(非加密)或 8883(TLS 加密)。 - **Client ID**:设置唯一的客户端标识符。 - **用户名和密码**:如果 Broker 需要身份验证,需提供相应的用户名和密码。 - **TLS 设置**:如果使用加密连接,需配置证书文件。 示例配置代码如下: ```plaintext Broker Address: test.mosquitto.org Port: 1883 Client ID: mqttfx_client_1 Username: test_user Password: test_password ``` #### 4. 发布与订阅消息 在 mqtt.fx 中,可以通过以下步骤实现消息的发布与订阅: - **订阅主题**:在“Subscribe”选项卡中输入目标主题,并点击“Subscribe”按钮。 - **发布消息**:在“Publish”选项卡中设置主题、QoS 等参数,并在消息框中输入内容后点击“Publish”按钮。 #### 5. 荣创信息与 mqtt.fx 荣创信息是一家专注于物联网技术的公司,可能在其产品或解决方案中使用了 mqtt.fx 或类似的 MQTT 客户端工具。具体应用需参考荣创信息的官方文档或技术支持[^3]。 #### 6. 常见问题与解决方法 - **无法连接到 Broker**:检查网络连接、Broker 地址和端口号是否正确。 - **认证失败**:确保用户名和密码正确无误。 - **消息丢失**:调整 QoS 级别以保证消息可靠性。 ```plaintext # 示例:连接到本地 Broker Broker Address: localhost Port: 1883 Client ID: local_client ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值