Skip to content

EMQX接入与证书维护 ​

EMQX只做MQTT Broker,使用后端HTTP回调认证授权。不要配置Broker直连PostgreSQL,不使用匿名放行、超级用户设备或公共通配ACL。

配置认证授权 ​

前提:后端可从Broker访问、设备/产品记录存在、服务用户名密码与独立回调密钥已安全配置。以下在EMQX控制台或其受保护管理API配置,实际菜单随安装版本变化,本轮未连接控制台验证。

项目值/要求
认证POST URLhttps://yunstack-s.duruofu.cn/api/v1/mqtt/access/authenticate
认证JSON{"username":"username","password":"{password}","clientid":"${clientid}"}
授权POST URLhttps://yunstack-s.duruofu.cn/api/v1/mqtt/access/authorize
授权JSON{"username":"username","clientid":"{clientid}","action":"action","topic":"{topic}"}
HTTP头Content-Type: application/json;x-mqtt-auth-token为独立随机密钥,与后端MQTT_AUTH_HTTP_TOKEN一致且至少32字符
响应认证{"result":"allow","is_superuser":false}或deny;授权{"result":"allow"}或deny
失配/服务异常拒绝;不在回调失败后降级匿名

设备认证按productId+physicalId查Device.secret,支持版本化摘要验证;服务身份用MQTT_USERNAME、MQTT_PASSWORD和MQTT_CLIENT_ID_PREFIX,保留用户名不可降级成设备。授权再按精确Topic白名单判断,见MQTT。认证缓存启用与缓存期限需在实际Broker核实,撤销密钥后也要考虑已有连接,不假设数据库改密钥会立即断开所有会话。

TLS与监听 ​

公开设备连接使用8883,服务域名证书须匹配yunstack-s.duruofu.cn;客户端验证可信根与主机名。既有迁移记录表明1883与8083明文监听已停止且持久化;Docker映射残留不等于监听仍启用。本次文档审核未重新扫描端口。

在可访问环境验证,不发送设备凭据:

bash
openssl s_client -connect yunstack-s.duruofu.cn:8883   -servername yunstack-s.duruofu.cn -verify_return_error </dev/null

应验证链与域名无错误;证书时间、SAN和完整中间链都要检查。ESP-IDF下载OSS交叉签名链须启用CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_CROSS_SIGNED_VERIFY=y,不关闭校验绕过。

1Panel续期与EMQX同步 ​

1Panel负责申请/续期网站证书,但EMQX使用的复制文件不会因此天然更新。既有服务器另设yunstack-mqtt-cert-sync脚本和systemd path/timer监听/定时同步并热重载,私钥只留服务器。本机local-tools工具不随仓库分发;新部署需管理员提供证书源、Broker实际挂载目录、权限和同步单元配置,不能照搬未知路径。

运维在服务器检查:

bash
systemctl status yunstack-mqtt-cert-sync.path yunstack-mqtt-cert-sync.timer
journalctl -u yunstack-mqtt-cert-sync.service --since '1 day ago'

对比1Panel源证书和EMQX副本的有效期/公钥摘要,确认8883实际对外证书已更换。只检查磁盘文件不够。此前验证过同证书同步与目录触发,尚不能据此证明未来一次真实自动签发周期成功。

修改EMQX配置前导出完整listeners配置并妥善保护。局部conf load可能将未带入的监听恢复默认,重新开放明文;热重载后必须检查8883证书、1883/8083关闭、现有认证与订阅。失败恢复完整旧配置和证书副本,再验证,不重建数据库或禁用TLS。

常见故障 ​

  • 8883连不上:查监听、代理是否为TCP透传、防火墙、DNS与容器端口,不把HTTPS反代当MQTT TCP代理。
  • 证书过期:区分1Panel续期失败、复制失败、权限失败和热重载失败。
  • Broker连接成功但无消息:查SUBACK是否拒绝;后端重启时回调短暂失败会触发订阅重试,单看Connected日志不足。
  • 认证401:先检查回调头和独立密钥,不将MQTT服务密码填到回调密钥。
  • 设备被踢:检查是否有模拟器复用了真实ClientId;模拟测试必须用独立随机身份。