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 
<think>我们正在处理用户关于如何在MQTT中开启TLS功能的问题。根据之前的对话历史,用户已经了解了在Linux上部署MQTT的三种方法(包管理器安装、Docker部署、源码编译),现在他们想了解如何开启TLS加密通信。 结合引用内容: - 引用[1]提到项目集成了SSL/TLS加密。 - 引用[2]提供了关于EMQX搭建SSL/TLS连接(包括wss)的参考链接。 - 引用[3]展示了一个使用MQTTClient连接MQTT服务的代码示例,但未涉及TLS。 - 引用[4]提到了使用带认证的MQTT适配器(包含用户名和密码)。 我们需要针对不同的部署方式(包管理器安装、Docker部署、源码编译)分别说明如何开启TLS,并给出配置示例和验证方法。 步骤: 1. 在包管理器安装方式中(如Mosquitto),修改配置文件`mosquitto.conf`,设置监听端口为8883(TLS标准端口),并指定证书文件路径。 2. 在Docker部署中,同样需要修改配置文件,并将宿主机的证书目录映射到容器内。 3. 在源码编译安装时,确保编译时启用了TLS支持(通常默认启用),然后同样修改配置文件。 此外,我们还需要说明如何生成自签名证书(用于测试)以及如何使用Let's Encrypt获取正式证书。 最后,给出客户端连接时的注意事项(例如使用`mqtts://`协议头,指定CA证书等)。 为了全面性,我们还可以提到一些常见问题,如端口冲突、证书权限问题等。 最后,生成相关问题,引导用户深入探讨。 </think>### 开启MQTT TLS加密通信的完整指南 通过TLS加密可保护MQTT通信安全,防止数据窃取和中间人攻击。以下是三种主流部署方式的配置方法: --- #### 一、系统包管理器安装(Mosquitto) **步骤**: 1. **修改配置文件** ```bash sudo nano /etc/mosquitto/mosquitto.conf ``` 添加以下内容: ```conf listener 8883 # TLS标准端口 certfile /etc/mosquitto/certs/server.pem keyfile /etc/mosquitto/certs/server.key cafile /etc/mosquitto/certs/ca.crt tls_version tlsv1.2 # 强制使用安全协议 ``` 2. **生成证书(测试用)** ```bash # 创建CA证书 openssl req -new -x509 -days 3650 -extensions v3_ca \ -keyout ca.key -out ca.crt # 生成服务器证书 openssl genrsa -out server.key 2048 openssl req -new -out server.csr -key server.key openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \ -CAcreateserial -out server.pem -days 365 ``` 3. **重启服务** ```bash sudo systemctl restart mosquitto ``` > **生产环境建议**:使用Let's Encrypt免费证书替代自签名证书[^2] --- #### 二、Docker容器部署(EMQX/Mosquitto) **EMQX容器启用TLS**: ```bash docker run -d --name emqx \ -p 8883:8883 \ -v /path/to/certs:/etc/emqx/certs \ emqx/emqx:latest \ emqx start \ --tls.listener.ssl.external.keyfile=/etc/emqx/certs/server.key \ --tls.listener.ssl.external.certfile=/etc/emqx/certs/server.pem ``` **Mosquitto容器启用TLS**: ```bash docker run -d -p 8883:8883 \ -v /path/to/certs:/mosquitto/certs \ eclipse-mosquitto \ mosquitto -c /mosquitto/config/mosquitto.conf \ --certfile /mosquitto/certs/server.pem \ --keyfile /mosquitto/certs/server.key ``` --- #### 三、客户端连接验证 **Python示例(paho-mqtt)**: ```python import ssl import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print("Connected with code:", rc) client.subscribe("test/tls") client = mqtt.Client() client.tls_set( ca_certs="/path/to/ca.crt", # CA证书 certfile="/path/to/client.pem", # 客户端证书(双向认证时需要) keyfile="/path/to/client.key", tls_version=ssl.PROTOCOL_TLSv1_2 ) client.on_connect = on_connect client.connect("mqtt.example.com", 8883, 60) client.loop_forever() ``` **QuecPython嵌入式设备连接**: ```python from umqtt import MQTTClient mqtt_cli = MQTTClient( client_id="device_001", server="mqtt.example.com", port=8883, ssl=True, ssl_params={ "ca_certs": "/qpy/ca.crt", "certfile": "/qpy/client.pem", # 可选 "keyfile": "/qpy/client.key" # 可选 } ) mqtt_cli.connect() ``` --- ### 关键注意事项 1. **证书要求** - 服务器证书CN需匹配域名 - 客户端证书需由同一CA签发(双向认证时) - RSA密钥长度≥2048位 2. **性能优化** ```conf tls_session_timeout 300 # 减少TLS握手开销 ``` 3. **安全加固** ```conf ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 ``` > **故障排查**:使用`openssl s_client -connect mqtt.example.com:8883`验证证书链完整性 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值