MQTT.js连接双向TLS配置的Mosquitto时出现自签名证书链错误的问题排查求助
MQTT.js连接双向TLS配置的Mosquitto时出现自签名证书链错误的问题排查求助
我最近在尝试用MQTT.js连接开启了双向TLS的Mosquitto broker,结果一直碰到证书链相关的错误,折腾了好久没理清问题,来求助大家!
先贴一下我遇到的报错信息:
Node.js端的错误:
node.js Error: self-signed certificate in certificate chain at TLSSocket.onConnectSecure (node:_tls_wrap:1677:34) at TLSSocket.emit (node:events:518:28) at TLSSocket._finishInit (node:_tls_wrap:1076:8) at ssl.onhandshakedone (node:_tls_wrap:862:12) { code: 'SELF_SIGNED_CERT_IN_CHAIN' }
Mosquitto的日志:
mosquitto 1749810067: New connection from 127.0.0.1:52519 on port 8883. 1749810067: OpenSSL Error[0]: error:0A000126:SSL routines::unexpected eof while reading 1749810067: Client <unknown> disconnected: protocol error.
其实我自己清楚证书链里有自签名的根CA,但这个错误提示总让我觉得哪里理解错了?毕竟我自己生成了完整的证书链,还通过OpenSSL验证过有效性,而且用MQTT客户端连接完全没问题,双向TLS走得很顺畅,所以我觉得证书和链本身应该是没问题的。
我的证书链结构
我搭建的证书链是这样的:
- ca.crt(根CA,自签名)
- intermediate.crt(中间CA)
- server.crt(Mosquitto服务端证书)
- client.crt(本地客户端证书)
已经用OpenSSL验证过有效性,且第三方MQTT客户端连接完全正常,所以证书这块应该没毛病。
Mosquitto配置
我把intermediate.crt和ca.crt合并成了ca_all.crt,然后在mosquitto.conf里做了如下配置:
listener 8883 protocol mqtt cafile ca_all.crt certfile server.crt keyfile server.key allow_anonymous true require_certificate true
MQTT.js的连接代码
我用的是这段代码来连接:
this._mqttClient = await mqtt.connectAsync( 'mqtts://localhost:8883', { protocol: 'mqtts', caPaths: 'ca_all.crt', certPath: 'client.crt', keyPath: 'client.key', });
我已经尝试过的方法
- 用第三方MQTT客户端连接:完全正常,排除证书和Mosquitto配置的问题
- 调整caPath的写法:试过把intermediate.crt和ca.crt作为数组传入,不行;直接传合并后的ca_all.crt也不行
- 设置系统环境变量NODE_EXTRA_CA_CERTS指向ca_all.crt:还是不行
2025-06-16 更新
我找到了一个类似的问题,但里面的解决方案都不适用我的场景:
- 选项1:不能禁用证书验证这类操作,不符合我的安全需求
- 选项2:针对非MQTT场景的方案,不适用
- 选项3:我的证书已经通过OpenSSL和第三方客户端验证过,没问题
2025-06-16 找到解决方案!
最后发现问题出在MQTT.js的参数使用上——必须先读取证书文件的内容,然后把内容传入选项里的ca、cert、key字段,而不是用caPaths、certPath、keyPath这些路径参数!
内容来源于stack exchange
相关产品推荐
相关产品推荐

