You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置带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 2048
  • sudo openssl req -new -x509 -days 1826 -key ca.key -out ca.crt(Common Name填写Broker A的IP)
  • sudo openssl genrsa -out server.key 2048
  • sudo 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
问题原因
  1. 认证凭证缺失:Broker B禁用了匿名访问(allow_anonymous false),但Broker A的桥接配置未提供任何认证信息(用户名密码或客户端证书),导致连接被拒绝。
  2. CA证书配置不规范:CA证书的Common Name填写了Broker A的IP,不符合CA证书的标识规范,可能引发SSL校验问题。
  3. 未启用双向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:25:33