配置带TSL/SSL支持的Mosquitto桥接遇授权问题求助
问题描述
本地Broker A尝试桥接至AWS上的Broker B(SSL连接),配置后AWS端日志显示认证失败:
New connection from 75.152.250.126:52995 on port 8884.
Sending CONNACK to MSU.target-broker (0, 5)
Client MSU.target-broker disconnected, not authorised.
已执行的证书生成步骤:
sudo openssl genrsa -out ca.key 2048sudo openssl req -new -x509 -days 1826 -key ca.key -out ca.crt(Common Name填写Broker A的IP)sudo openssl genrsa -out server.key 2048sudo openssl req -new -out server.csr -key server.key(Common Name填写AWS服务器IP)sudo openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650
Broker A配置:
# listen to the local data I have setup (works fine) listener 1883 connection target-broker address 3.208.62.218:8884 bridge_cafile E:\SSL\ca.crt topic MSUFridge/#
Broker B(AWS)配置:
listener 8884 allow_anonymous false certfile /etc/mosquitto/certs/server.crt keyfile /etc/mosquitto/certs/server.key cafile /etc/mosquitto/certs/ca.crt
问题原因
- 认证凭证缺失:Broker B禁用了匿名访问(
allow_anonymous false),但Broker A的桥接配置未提供任何认证信息(用户名密码或客户端证书),导致连接被拒绝。 - CA证书配置不规范:CA证书的Common Name填写了Broker A的IP,不符合CA证书的标识规范,可能引发SSL校验问题。
- 未启用双向SSL认证:当前Broker B仅配置了服务端证书,但未要求客户端提供证书,Broker A也没有配置客户端证书用于身份验证。
解决方案
步骤1:重新生成规范的证书链
1.1 生成CA证书(Common Name填CA标识,如"MyMQTTBridgeCA")
sudo openssl genrsa -out ca.key 2048 sudo openssl req -new -x509 -days 1826 -key ca.key -out ca.crt
注意:Common Name字段填写CA的专属名称(如"MyMQTTBridgeCA"),不要填任何Broker的IP或域名。
1.2 生成Broker B的服务端证书(Common Name填AWS服务器IP或域名)
sudo openssl genrsa -out server-b.key 2048 sudo openssl req -new -out server-b.csr -key server-b.key
Common Name字段填写AWS服务器的公网IP(3.208.62.218)或域名。
签发服务端证书:
sudo openssl x509 -req -in server-b.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server-b.crt -days 3650
1.3 生成Broker A的客户端证书(用于桥接认证)
sudo openssl genrsa -out client-a.key 2048 sudo openssl req -new -out client-a.csr -key client-a.key
Common Name字段可填写Broker A的本地IP或标识(如"LocalBrokerA")。
签发客户端证书:
sudo openssl x509 -req -in client-a.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client-a.crt -days 3650
1.4 证书分发
- 将
ca.crt、client-a.crt、client-a.key复制到Broker A的SSL目录(如E:\SSL\) - 将
ca.crt、server-b.crt、server-b.key复制到Broker B的/etc/mosquitto/certs/目录
步骤2:修改Broker B(AWS)配置,启用双向SSL认证
编辑/etc/mosquitto/mosquitto.conf:
listener 8884 allow_anonymous false # 启用双向SSL,要求客户端提供信任CA签发的证书 require_certificate true certfile /etc/mosquitto/certs/server-b.crt keyfile /etc/mosquitto/certs/server-b.key cafile /etc/mosquitto/certs/ca.crt # 可选:将客户端证书的Common Name作为用户名使用 # use_identity_as_username true
步骤3:修改Broker A配置,添加客户端证书认证
编辑Broker A的配置文件:
# 本地监听(保持不变) listener 1883 connection target-broker address 3.208.62.218:8884 # CA证书用于验证Broker B的服务端证书 bridge_cafile E:\SSL\ca.crt # 客户端证书和密钥,用于Broker B认证Broker A bridge_certfile E:\SSL\client-a.crt bridge_keyfile E:\SSL\client-a.key # 桥接主题完整配置(双向同步,QoS级别0) topic MSUFridge/# both 0
步骤4:重启两个Broker服务
- Broker A:重启本地Mosquitto服务
- Broker B(AWS):执行
sudo systemctl restart mosquitto
替代方案:使用用户名密码认证(若不需要双向SSL)
如果不想使用客户端证书,可通过用户名密码完成认证:
1. 在Broker B上创建认证用户
# 首次创建密码文件 sudo mosquitto_passwd -c /etc/mosquitto/passwd bridge_user # 按提示输入密码(如bridge_pass123)
2. 修改Broker B配置
listener 8884 allow_anonymous false password_file /etc/mosquitto/passwd certfile /etc/mosquitto/certs/server-b.crt keyfile /etc/mosquitto/certs/server-b.key cafile /etc/mosquitto/certs/ca.crt
3. 修改Broker A配置
connection target-broker address 3.208.62.218:8884 bridge_cafile E:\SSL\ca.crt # 添加桥接用户名密码 bridge_username bridge_user bridge_password bridge_pass123 topic MSUFridge/# both 0
内容的提问来源于stack exchange,提问作者Sina Safarabadi
相关产品推荐
相关产品推荐

