跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

Mosquitto 完整安全配置指南

以下是一份可直接用于生产环境的完整配置,涵盖密码认证、ACL权限控制、TLS/SSL加密。

一、配置架构总览

/etc/mosquitto/
├── mosquitto.conf          # 主配置文件(引用所有子配置)
├── conf.d/
│   ├── listener.conf       # 监听器配置
│   ├── auth.conf           # 密码认证配置
│   ├── acl.conf            # ACL 权限配置
│   ├── tls.conf            # TLS/SSL 加密配置
│   └── performance.conf    # 性能优化配置
├── passwd                   # 密码文件
├── aclfile                  # ACL 权限文件
└── certs/
    ├── ca.crt              # CA 证书
    ├── server.crt          # 服务器证书
    └── server.key          # 服务器私钥

二、安装 Mosquitto

# 安装
sudo apt update
sudo apt install mosquitto mosquitto-clients -y

# 验证
sudo systemctl status mosquitto

三、生成 TLS 证书

3.1 创建证书目录

sudo mkdir -p /etc/mosquitto/certs
cd /etc/mosquitto/certs

3.2 生成 CA 根证书

# 生成 CA 私钥
sudo openssl genrsa -out ca.key 2048

# 生成 CA 证书(有效期 10 年)
sudo openssl req -new -x509 -days 3650 -key ca.key -out ca.crt \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=MQTT-CA"

3.3 生成服务器证书

# 生成服务器私钥
sudo openssl genrsa -out server.key 2048

# 生成证书签名请求
sudo openssl req -new -key server.key -out server.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=mqtt.example.com"

# 签发服务器证书(有效期 1 年)
sudo openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out server.crt -days 365

3.4 生成客户端证书(可选,双向 TLS 用)

# 生成客户端私钥
sudo openssl genrsa -out client.key 2048

# 生成客户端证书签名请求
sudo openssl req -new -key client.key -out client.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=client_device_001"

# 签发客户端证书
sudo openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out client.crt -days 365

3.5 设置证书权限

sudo chmod 600 server.key client.key
sudo chown -R mosquitto:mosquitto /etc/mosquitto/certs

四、创建密码文件

4.1 添加用户

# 创建密码文件并添加第一个用户(-c 表示创建新文件)
sudo mosquitto_passwd -c /etc/mosquitto/passwd admin

# 添加更多用户(不需要 -c)
sudo mosquitto_passwd /etc/mosquitto/passwd sensor_001
sudo mosquitto_passwd /etc/mosquitto/passwd sensor_002
sudo mosquitto_passwd /etc/mosquitto/passwd mobile_app
sudo mosquitto_passwd /etc/mosquitto/passwd guest

# 设置安全权限
sudo chmod 600 /etc/mosquitto/passwd
sudo chown mosquitto:mosquitto /etc/mosquitto/passwd

4.2 验证密码文件

# 查看用户列表(密码是加密的)
sudo cat /etc/mosquitto/passwd

五、创建 ACL 权限文件

sudo nano /etc/mosquitto/aclfile
# ================================================================
#                    Mosquitto ACL 权限配置文件
# ================================================================
#
# 语法说明:
#   user <用户名>          - 指定后续规则属于哪个用户
#   topic [read|write|readwrite|deny] <主题过滤器>
#   pattern [read|write|readwrite|deny] <动态模式>
#
# 权限说明:
#   read      = 订阅权限
#   write     = 发布权限
#   readwrite = 发布 + 订阅
#   deny      = 拒绝(优先级最高)
#
# 动态变量:
#   %u = 当前用户名
#   %c = 当前客户端 ID
# ================================================================


# ================================================================
# 第一部分:全局黑名单(最高优先级)
# ================================================================

# 禁止任何人访问系统主题
topic deny $SYS/#

# 禁止任何人访问管理员主题
topic deny admin/#

# 禁止任何人访问敏感配置主题
topic deny config/secret/#


# ================================================================
# 第二部分:管理员用户(全部权限)
# ================================================================

user admin
topic readwrite #
topic readwrite $SYS/broker/clients/connected
topic readwrite $SYS/broker/load/#


# ================================================================
# 第三部分:传感器设备(只发布,不订阅)
# ================================================================

# 传感器 001
user sensor_001
topic write sensors/temperature/001/data
topic write sensors/humidity/001/data
topic write sensors/status/001

# 传感器 002
user sensor_002
topic write sensors/temperature/002/data
topic write sensors/humidity/002/data
topic write sensors/status/002

# 通用传感器权限(使用 pattern 动态匹配)
# 用户 sensor_xxx 自动拥有 sensors/xxx/# 的写入权限
pattern write sensors/%u/#


# ================================================================
# 第四部分:手机 APP(发布命令 + 订阅响应)
# ================================================================

user mobile_app
# 发布控制命令
topic write cmd/light/+
topic write cmd/ac/+
topic write cmd/lock/+

# 订阅状态更新
topic read telemetry/+/status
topic read telemetry/+/temperature
topic read notification/+

# 订阅自己的命令响应
topic read response/+

# 通配符批量授权
topic read home/+/+/status


# ================================================================
# 第五部分:访客用户(只读公开主题)
# ================================================================

user guest
topic read public/#
topic read weather/#
topic read news/#

# 访客禁止写入
topic deny write #


# ================================================================
# 第六部分:动态设备授权(高级用法)
# ================================================================

# 为每个设备自动分配专属主题
# 例如:client_id=device_001 自动拥有 devices/device_001/telemetry 的写入权限
pattern write devices/%c/telemetry
pattern write devices/%c/status
pattern read devices/%c/config
pattern read devices/%c/command/+

# 为每个用户自动分配专属主题
# 例如:username=alice 自动拥有 user/alice/outbox 的写入权限
pattern write user/%u/outbox
pattern read user/%u/inbox


# ================================================================
# 第七部分:审计日志用户(只读监控主题)
# ================================================================

user auditor
topic read $SYS/broker/#
topic read telemetry/+/status
topic read devices/+/status


# ================================================================
# 第八部分:规则优先级说明
# ================================================================
#
# 1. deny 规则 > allow 规则(拒绝优先)
# 2. 特定用户规则 > 全局规则
# 3. 规则按顺序匹配,先匹配到的生效
# 4. 未匹配到任何规则 = 无权限(拒绝)
#
# 测试命令:
#   mosquitto_sub -h localhost -t "test" -u 用户名 -P 密码
#   mosquitto_pub -h localhost -t "test" -m "hello" -u 用户名 -P 密码
# ================================================================

六、创建配置文件

6.1 主配置文件(引用所有子配置)

sudo tee /etc/mosquitto/mosquitto.conf << 'EOF'
# ================================================================
#                    Mosquitto 主配置文件
# ================================================================

# 包含所有子配置
include_dir /etc/mosquitto/conf.d

# 基础运行配置
user mosquitto
connection_messages true
log_timestamp true
log_timestamp_format %Y-%m-%dT%H:%M:%S

# 持久化配置
persistence true
persistence_location /var/lib/mosquitto/
persistence_file mosquitto.db
autosave_interval 300
autosave_on_changes false
store_retained_messages true

# 日志配置(基础)
log_dest file /var/log/mosquitto/mosquitto.log
log_dest syslog
log_type error
log_type warning
log_type notice
log_type information

# 禁用订阅/取消订阅日志(减少日志量)
# log_type subscribe
# log_type unsubscribe

# PID 文件
pid_file /run/mosquitto/mosquitto.pid
EOF

6.2 监听器配置

sudo tee /etc/mosquitto/conf.d/listener.conf << 'EOF'
# ================================================================
#                    监听器配置
# ================================================================

# ---------- 内网监听(明文,仅内网访问) ----------
listener 1883 192.168.1.10
# 可选:限制内网连接数
max_connections 1000

# ---------- 公网监听(TLS 加密) ----------
listener 8883 0.0.0.0
max_connections 5000

# ---------- WebSocket 监听(浏览器客户端) ----------
listener 8083 0.0.0.0
protocol websockets
max_connections 500

# ---------- WebSocket Secure(加密) ----------
listener 8084 0.0.0.0
protocol websockets
max_connections 500

# ---------- 本地管理端口(仅本机) ----------
listener 1884 127.0.0.1
max_connections 5
EOF

6.3 安全认证配置

sudo tee /etc/mosquitto/conf.d/auth.conf << 'EOF'
# ================================================================
#                   安全认证配置
# ================================================================

# 禁止匿名访问(生产环境必须)
allow_anonymous false

# 密码文件路径
password_file /etc/mosquitto/passwd

# 每个客户端只能有一个连接
# per_listener_settings false
EOF

6.4 ACL 权限配置

sudo tee /etc/mosquitto/conf.d/acl.conf << 'EOF'
# ================================================================
#                    ACL 权限配置
# ================================================================

# ACL 文件路径
acl_file /etc/mosquitto/aclfile

# 允许空密码(安全起见,保持 false)
# allow_zero_length_clientid false
EOF

6.5 TLS/SSL 加密配置

sudo tee /etc/mosquitto/conf.d/tls.conf << 'EOF'
# ================================================================
#                    TLS/SSL 加密配置
# ================================================================

# ---------- TLS 加密(公网监听器 8883 使用) ----------
# 注意:listener 8883 已在 listener.conf 中定义

# 服务器证书和私钥
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key

# CA 证书(验证客户端证书用)
cafile /etc/mosquitto/certs/ca.crt

# TLS 版本(推荐 tlsv1.2 或 tlsv1.3)
tls_version tlsv1.2

# 加密套件(推荐安全套件)
ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256

# ---------- 双向 TLS(客户端也需要提供证书) ----------
# 取消注释以下行以启用双向 TLS
# require_certificate true
# use_identity_as_username true

# ---------- WebSocket Secure(8084 端口) ----------
# 注意:listener 8084 已在 listener.conf 中定义
# WebSocket 使用相同的证书文件
EOF

6.6 性能优化配置

sudo tee /etc/mosquitto/conf.d/performance.conf << 'EOF'
# ================================================================
#                   性能优化配置
# ================================================================

# ---------- 连接限制 ----------
max_connections 10000

# ---------- 消息队列 ----------
max_inflight_messages 20
max_queued_messages 1000
queue_qos0_messages true

# ---------- 内存限制 ----------
memory_limit 256

# ---------- 网络缓冲区 ----------
socket_recv_buffer 65536
socket_send_buffer 65536

# ---------- 超时配置 ----------
max_keepalive 65535

# ---------- WebSocket ----------
websockets_log_level 0

# ---------- 服务端通知 ----------
# connection_messages true
EOF

七、设置文件权限

# 设置所有配置文件的权限
sudo chown -R mosquitto:mosquitto /etc/mosquitto/
sudo chmod 644 /etc/mosquitto/mosquitto.conf
sudo chmod 644 /etc/mosquitto/conf.d/*.conf
sudo chmod 600 /etc/mosquitto/passwd
sudo chmod 644 /etc/mosquitto/aclfile
sudo chmod 600 /etc/mosquitto/certs/*.key
sudo chmod 644 /etc/mosquitto/certs/*.crt

# 创建日志文件
sudo touch /var/log/mosquitto/mosquitto.log
sudo chown mosquitto:mosquitto /var/log/mosquitto/mosquitto.log
sudo chmod 640 /var/log/mosquitto/mosquitto.log

八、配置语法检查与启动

8.1 检查配置语法

# 检查主配置
sudo mosquitto -c /etc/mosquitto/mosquitto.conf --test-check

# 正常输出示例:
# Config loaded from /etc/mosquitto/mosquitto.conf.
# Configuration check passed.

8.2 启动服务

# 重启服务加载新配置
sudo systemctl restart mosquitto

# 检查状态
sudo systemctl status mosquitto

# 查看日志
sudo journalctl -u mosquitto -f

8.3 检查端口监听

# 检查所有端口
sudo ss -tlnp | grep mosquitto

# 预期输出:
# LISTEN 0 4096 0.0.0.0:8883  0.0.0.0:*  users:(("mosquitto",pid=xxx))
# LISTEN 0 4096 0.0.0.0:8083  0.0.0.0:*  users:(("mosquitto",pid=xxx))
# LISTEN 0 4096 0.0.0.0:8084  0.0.0.0:*  users:(("mosquitto",pid=xxx))
# LISTEN 0 4096 192.168.1.10:1883 0.0.0.0:* users:(("mosquitto",pid=xxx))
# LISTEN 0 4096 127.0.0.1:1884 0.0.0.0:* users:(("mosquitto",pid=xxx))

九、客户端连接测试

9.1 内网连接(明文,1883 端口)

# 测试发布
mosquitto_pub -h 192.168.1.10 -p 1883 \
  -t "sensors/temperature/001/data" \
  -m '{"value":23.5,"unit":"celsius"}' \
  -u sensor_001 -P 密码

# 测试订阅
mosquitto_sub -h 192.168.1.10 -p 1883 \
  -t "telemetry/+/status" \
  -u mobile_app -P 密码 -v

9.2 公网 TLS 连接(加密,8883 端口)

# 订阅(单向 TLS)
mosquitto_sub -h mqtt.example.com -p 8883 \
  -t "telemetry/+/status" \
  -u mobile_app -P 密码 \
  --cafile /etc/mosquitto/certs/ca.crt \
  -v

# 发布
mosquitto_pub -h mqtt.example.com -p 8883 \
  -t "cmd/light/livingroom" \
  -m "on" \
  -u mobile_app -P 密码 \
  --cafile /etc/mosquitto/certs/ca.crt

9.3 双向 TLS 连接(需提供客户端证书)

# 双向 TLS 订阅
mosquitto_sub -h mqtt.example.com -p 8883 \
  -t "devices/device_001/command/+" \
  --cafile /etc/mosquitto/certs/ca.crt \
  --cert /etc/mosquitto/certs/client.crt \
  --key /etc/mosquitto/certs/client.key \
  -v

9.4 WebSocket 连接

# 使用 wscat 测试 WebSocket
npm install -g wscat
wscat -c "ws://mqtt.example.com:8083" -H "username: mobile_app" -H "password: 密码"

十、ACL 权限验证测试

10.1 测试传感器发布权限

# ✅ 传感器 001 发布到自己的主题(应该成功)
mosquitto_pub -h localhost -t "sensors/temperature/001/data" \
  -m "23.5" -u sensor_001 -P 密码

# ❌ 传感器 001 发布到其他主题(应该失败)
mosquitto_pub -h localhost -t "sensors/temperature/002/data" \
  -m "23.5" -u sensor_001 -P 密码
# 预期:Connection Refused: not authorised

10.2 测试 App 发布命令和订阅响应

# ✅ App 发布命令(应该成功)
mosquitto_pub -h localhost -t "cmd/light/livingroom" \
  -m "on" -u mobile_app -P 密码

# ✅ App 订阅状态(应该成功)
mosquitto_sub -h localhost -t "telemetry/+/status" \
  -u mobile_app -P 密码 -C 1 -W 2

# ❌ App 尝试写入系统主题(应该失败)
mosquitto_pub -h localhost -t "$SYS/broker/version" \
  -m "test" -u mobile_app -P 密码
# 预期:Connection Refused: not authorised

10.3 测试访客权限

# ✅ 访客读取公开主题(应该成功)
mosquitto_sub -h localhost -t "public/news" \
  -u guest -P 密码 -C 1 -W 2

# ❌ 访客尝试写入(应该失败)
mosquitto_pub -h localhost -t "public/news" \
  -m "test" -u guest -P 密码
# 预期:Connection Refused: not authorised

十一、常见问题排查

问题检查项解决方案
无法连接 8883TLS 证书是否正确检查证书路径和权限
认证失败密码是否正确用 mosquitto_passwd -v 验证
ACL 拒绝用户权限是否匹配检查 aclfile 中的规则顺序
证书过期检查证书有效期openssl x509 -in server.crt -noout -dates
端口未监听配置是否加载查看日志:journalctl -u mosquitto -f

十二、配置清单汇总

# 查看所有配置文件
ls -la /etc/mosquitto/
ls -la /etc/mosquitto/conf.d/

# 确认以下文件都存在:
# /etc/mosquitto/mosquitto.conf
# /etc/mosquitto/conf.d/listener.conf
# /etc/mosquitto/conf.d/auth.conf
# /etc/mosquitto/conf.d/acl.conf
# /etc/mosquitto/conf.d/tls.conf
# /etc/mosquitto/conf.d/performance.conf
# /etc/mosquitto/passwd
# /etc/mosquitto/aclfile
# /etc/mosquitto/certs/ca.crt
# /etc/mosquitto/certs/server.crt
# /etc/mosquitto/certs/server.key

总结

安全层配置项状态
身份认证password_file✅ 已配置
匿名访问allow_anonymous false✅ 已禁用
权限控制acl_file✅ 已配置
传输加密TLS 8883 端口✅ 已配置
内网隔离1883 绑定内网 IP✅ 已配置
证书权限600 私钥权限✅ 已配置
防火墙仅开放必要端口需自行配置
作者

老丹

关注我
其他文章
上一个

深入理解正向代理:原理、用途、协议与实战指南

下一个

Mosquitto TLS/SSL 加密配置完全指南

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • Linux系统的安全基石:深入理解可插拔认证模块(PAM) 2026年7月27日
  • vsftpd 完全指南:从核心原理到Docker容器化部署 2026年7月27日
  • 互联网的”导航”安全卫士:深入解读DNSSEC 2026年7月27日
  • Ubuntu DNS 配置完全指南 2026年7月27日
  • 在 Ubuntu 中使用 Certbot 的操作指南 2026年7月27日

文章分类

  • C/C++开发 (13)
  • Docker容器 (3)
  • Linux工具包 (10)
  • Linux服务配置 (33)
  • Linux系统 (10)
  • OpenWrt路由 (2)
  • Shell脚本 (3)
  • 安防技术 (4)
  • 数据安全 (30)
  • 网络协议 (17)
  • 计算机理论 (22)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号