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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 09:18:01