mosquitto配置用户名密码及tls加密双向认证访问

本文详细介绍在Linux环境下安装配置MQTTBroker的过程,包括mosquitto版本的选择、源码编译、依赖安装、服务启动、订阅发布功能验证,以及如何配置用户名密码访问和TLS加密双向认证。

需求背景

需要在linux环境中安装配置mqtt broker,并配置用户名、密码访问及tls加密传输认证;

准备资料

1、centos 6.5 64bit
2、mosquitto1.4.4版本

安装mqtt broker服务

1、解压源码包tar xvf mosquitto-1.4.14.tar.gz
2、进入源码目录,编辑config.mk文件:
分别修改
WITH_SRV:=no —->WITH_SRV:=yes
WITH_UUID:=no —->WITH_UUID:=yes
3、安装必要依赖包
yum install gcc gcc-c++ openssl-devel
4、make && make install 安装即可;
5、启动服务
5.1、默认路径
mqtt broker服务默认安装在/usr/local/bin
配置文件默认在/etc/mosquitto
5.2、添加基本配置
cd /etc/mosquitto/进入配置文件目录;
cp mosquitto.conf.example mosquitto.conf,拷贝基本配置文件;
执行mosquitto -c /etc/mosquitto/mosquitto.conf -v启动服务;
会报错,如下:
1600225060: mosquitto version 1.4.14 (build date 2020-09-16 10:51:44+0800) starting
1600225060: Config loaded from /etc/mosquitto/mosquitto.conf.
1600225060: Opening ipv4 listen socket on port 1883.
1600225060: Opening ipv6 listen socket on port 1883.
1600225060: Error: Invalid user ‘mosquitto’.
默认是用mosquitto帐号启动,添加帐号即可;
useradd mosquitto,然后再启动
看到如下信息,说明broker已经启动成功;
1600225144: mosquitto version 1.4.14 (build date 2020-09-16 10:51:44+0800) starting
1600225144: Config loaded from /etc/mosquitto/mosquitto.conf.
1600225144: Opening ipv4 listen socket on port 1883.
1600225144: Opening ipv6 listen socket on port 1883.
6、验证订阅、发布功能是否正常
6.1、订阅
执行命令:mosquitto_sub -h 127.0.0.1 -p 1883 -t ‘/mqttbroker/test’
mosquitto_sub: error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
报错了,是libmosquitto.so.1库找不到问题,只需要添加到加载搜索的环境变量即可;
默认安装时,libmosquitto.so安装到了/usr/local/lib路径,所以只需要将这个路径添加到ldconfig搜索的路径就行;
echo ‘/usr/local/lib’ > /etc/ld.so.conf.d/local-lib.conf,然后再ldconfig -v | grep mosquitto,看到如下信息,则说明加载成功,再次执行订阅命令;
libmosquitt

<think> 我们之前讨论了在Mosquitto配置认证(包括用户名密码认证TLS证书认证)。现在用户的问题是:在配置了单项认证(即TLS单向认证)后,如何使用Python进行调用。 单项TLS认证是指客户端验证服务器的证书,但服务器不验证客户端的证书。因此,在Python中连接Mosquitto时,我们需要提供CA证书(用于验证服务器证书),但不需要提供客户端的证书和私钥。 步骤: 1. 确保Mosquitto服务器已经配置TLS单向认证(即服务器配置了CA证书、服务器证书和私钥,客户端只需要CA证书)。 2. 在客户端机器上,准备好CA证书(ca.crt)。 3. 使用Python的paho-mqtt库进行连接。 具体操作: 首先,安装paho-mqtt库: ```bash pip install paho-mqtt ``` 然后,编写Python代码。以下是一个示例: ```python import paho.mqtt.client as mqtt # 回调函数,当收到CONNACK响应时调用 def on_connect(client, userdata, flags, rc): print(f"Connected with result code {rc}") # 订阅主题 client.subscribe("test/topic") # 回调函数,当收到发布的消息时调用 def on_message(client, userdata, msg): print(f"{msg.topic}: {msg.payload.decode()}") # 创建客户端实例 client = mqtt.Client() # 设置回调函数 client.on_connect = on_connect client.on_message = on_message # 设置TLS(单项认证) client.tls_set(ca_certs="/path/to/ca.crt") # 指定CA证书路径 # 如果服务器要求用户名密码认证(可选,如果配置用户名密码则需要) # client.username_pw_set("username", "password") # 连接服务器(端口通常为8883) client.connect("mqtt.example.com", 8883, 60) # 启动网络循环(阻塞式,会一直运行直到调用disconnect) client.loop_forever() ``` 注意: - 如果Mosquitto服务器同时启用了用户名密码认证(如之前提到的组合认证),则还需要设置`client.username_pw_set`。 - 如果服务器使用的是自签名证书,则可能需要设置`client.tls_insecure_set(True)`来跳过主机名验证(不推荐生产环境使用)。 如果没有启用用户名密码,可以省略`client.username_pw_set`。 另外,如果遇到SSL证书验证错误,请确保证书路径正确,且证书是有效的。 相关问题: 1. 如何在Mosquitto配置双向TLS认证? 2. 使用Python连接Mosquitto双向认证时需要注意什么? 3. 如何处理Mosquitto连接中的SSL错误? 4. 如何用Python同时使用TLS用户名密码认证? </think> ### Mosquitto单项认证后使用Python调用的方法 在Mosquitto配置TLS单向认证(客户端验证服务器证书)后,使用Python的`paho-mqtt`库进行通信的完整步骤如下: #### 一、Python环境准备 1. 安装paho-mqtt库: ```bash pip install paho-mqtt ``` #### 二、Python客户端配置(单向认证) ```python import paho.mqtt.client as mqtt import ssl # 连接回调 def on_connect(client, userdata, flags, rc): if rc == 0: print("✅ 连接成功") client.subscribe("sensor/temp") else: print(f"❌ 连接失败,错误码: {rc}") # 消息接收回调 def on_message(client, userdata, msg): print(f"📨 收到消息: {msg.topic} -> {msg.payload.decode()}") # 创建客户端 client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message # 配置TLS单向认证 client.tls_set( ca_certs="/path/to/ca.crt", # CA证书路径 cert_reqs=ssl.CERT_REQUIRED # 要求验证服务器证书 ) # 如需用户名密码认证(可选) # client.username_pw_set("test-user", "123456") # 连接服务器 client.connect("mqtt.example.com", 8883, 60) # 启动消息循环 client.loop_forever() ``` #### 三、关键参数说明 | 参数 | 说明 | 示例值 | |------|------|--------| | `ca_certs` | CA根证书路径 | `/etc/mosquitto/certs/ca.crt` | | `cert_reqs` | 证书验证级别 | `ssl.CERT_REQUIRED`(必须验证) | | `tls_version` | TLS协议版本 | `ssl.PROTOCOL_TLSv1_2` | | 端口 | 加密端口 | `8883` | #### 四、消息发布示例 ```python # 发布保留消息 client.publish( topic="sensor/temp", payload="25.5℃", qos=1, retain=True # 保留标志[^1] ) ``` #### 五、错误处理 ```python def on_disconnect(client, userdata, rc): if rc != 0: print(f"⚠️ 意外断开: {mqtt.error_string(rc)}") client.on_disconnect = on_disconnect ``` #### 六、证书验证失败常见原因 1. **证书路径错误**:使用绝对路径 `os.path.abspath("ca.crt")` 2. **证书过期**:使用 `openssl x509 -in ca.crt -noout -dates` 检查 3. **主机名不匹配**:添加 `client.tls_insecure_set(True)` 临时绕过(仅测试环境) > **注意**:生产环境应始终验证证书,可通过以下命令生成合规证书: > ```bash > openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 > ``` ### 相关问题 1. 如何在Python中实现Mosquitto双向认证连接? 2. 使用Python如何监控Mosquitto的实时连接状态? 3. 在Docker容器中部署Mosquitto时如何管理证书? 4. Mosquitto的保留消息(RETAIN)机制有哪些应用场景?[^1] [^1]: 测试步骤:发布一条带有retain标志的消息:`mosquitto_pub -t "sensor/temp" -m "25.5" -r -q 1`
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值