使用mqtt.js通过wss连接eclipse-mosquitto容器失败求助
解决mqtt.js连接Mosquitto wss端口失败(错误码1006)的问题
针对你遇到的mqtt.js无法连接wss端口,但ws正常、MQTT Explorer能通过TLS连接的情况,按以下方向排查:
1. 检查Mosquitto的wss监听配置是否正确
确保mosquitto.conf里的8084端口配置明确指定了websocket协议,完整配置示例:
listener 8084 protocol websockets cafile /mosquitto/certs/ca.crt certfile /mosquitto/certs/server.crt keyfile /mosquitto/certs/server.key
如果缺少protocol websockets,8084实际是mqtts端口而非wss端口,这会导致mqtt.js用wss协议连接失败,而MQTT Explorer用mqtts协议连接成功,刚好匹配你的现象。
2. 确认证书路径与权限
- 检查配置中的证书路径是否是容器内部的路径(比如你挂载了本地
./certs到容器/mosquitto/certs,配置里就必须写/mosquitto/certs/xxx,不能写本地路径)。 - 进入容器执行
ls -l /mosquitto/certs,确保证书文件权限为可读(比如chmod 644),Mosquitto进程无法读取证书会导致wss监听静默失效,且可能不记录日志。
3. 验证证书的IP/域名匹配性
mqtt.js在TLS握手时会严格校验证书的Subject Alternative Name(SAN)或CN是否匹配你连接的IP(37.97.203.138):
- 如果证书是基于域名签发的,用IP连接会触发校验失败,导致WebSocket异常关闭(错误码1006)。
- 检查MQTT Explorer是否关闭了证书校验(比如勾选了"忽略证书错误"),如果是,说明证书本身存在匹配问题。
4. 确认容器端口与监听状态
- 检查docker-compose的端口映射是否为
8084:8084,避免端口映射错误。 - 进入容器执行
netstat -tulpn | grep mosquitto,确认8084端口处于LISTEN状态,如果没监听,说明配置有误导致wss端口未启动。
5. 调整mqtt.js的连接配置
如果使用自签证书,需要在mqtt.js选项中添加证书校验相关配置(仅测试环境使用,生产环境请使用合法证书):
const mqtt = require('mqtt'); const client = mqtt.connect('wss://37.97.203.138:8084', { clientId: 'mqttjs-client', rejectUnauthorized: false, // 跳过证书校验,仅测试用 // 若使用合法证书,可添加ca选项指定CA证书 // ca: fs.readFileSync('./certs/ca.crt') });
内容的提问来源于stack exchange,提问作者Xiduzo
相关产品推荐
相关产品推荐

