Mosquitto MQTT配置咨询:证书与用户名密码认证共存实现
解决MQTT Broker同时支持证书认证与账号密码认证的方案
你可以借助Mosquitto的per_listener_settings特性,给两类设备分别配置独立的监听端口,各自启用对应的认证规则,就能解决冲突问题。
具体配置步骤
1. 为证书认证设备配置专用端口
这个端口启用TLS并强制要求证书认证,不启用账号密码校验:
listener 8883 per_listener_settings true require_certificate true cafile pathtocafile certfile pathtocertfile keyfile pathtokeyfile
配置后,只有携带合法客户端证书的设备能通过这个端口连接,无需提供用户名密码。
2. 为账号密码认证设备配置专用端口
这个端口启用用户名密码校验,不要求证书(如果需要加密连接,也可以开启TLS但关闭证书强制校验):
listener 1883 per_listener_settings true password_file pathtopasswordfile # 若需要加密连接,可添加以下TLS配置,保持require_certificate false即可 # cafile pathtocafile # certfile pathtocertfile # keyfile pathtokeyfile # require_certificate false
配置后,设备只需提供正确的用户名密码就能通过这个端口连接,无需证书。
为什么之前的配置会冲突
同一个监听端口下,没法同时兼容两种完全独立的认证逻辑:
- 当你配置
password_file时,Broker会要求所有连接都提供用户名密码,导致无账号密码的证书认证设备被拒绝; - 同时配置证书路径又设
require_certificate false时,部分账号密码设备可能在TLS握手阶段因未携带证书出现兼容性问题,或者Broker会同时触发两种认证检查,导致验证失败。
内容的提问来源于stack exchange,提问作者bluscape
相关产品推荐
相关产品推荐

