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

VPS部署Mosquitto TLS遇证书验证失败及握手错误问题

Mosquitto TLS配置问题排查与解决

核心矛盾分析

ESP32能正常连接并发布消息,但mosquitto_sub客户端触发证书验证/SSL握手失败,说明服务器TLS配置本身有效,问题集中在mosquitto_sub的调用逻辑或本地证书信任链上。

可能原因及解决办法

1. mosquitto_sub未指定信任的CA证书

自签名或私有CA签发的服务器证书,默认不会被mosquitto_sub信任,必须显式指定根CA证书路径:

mosquitto_sub -h 你的VPS域名/IP -p 8883 -t "test/topic" --cafile /path/to/ca.crt

注意:这里的ca.crt是签发服务器证书的根CA证书,而非服务器证书本身

2. 证书CN/SAN与连接地址不匹配

若mosquitto_sub用IP连接但证书未包含该IP,或用域名连接但证书CN/SAN无对应域名,会触发验证失败:

  • 先检查证书信息:
    openssl x509 -in server.crt -text -noout
    
    查看Subject: CN=和Subject Alternative Name字段
  • 解决:
    • 连接时使用证书已包含的域名/IP;
    • 重新生成证书时,在CSR配置文件中添加正确的SAN:
      [req]
      req_extensions = v3_req
      distinguished_name = req_distinguished_name
      
      [req_distinguished_name]
      CN = 你的VPS域名
      
      [v3_req]
      subjectAltName = @alt_names
      
      [alt_names]
      DNS.1 = 你的VPS域名
      IP.1 = 你的VPS公网IP
      
      再生成CSR:openssl req -new -key server.key -out server.csr -config csr.conf

3. TLS版本/加密套件不兼容

旧版mosquitto_sub或系统OpenSSL可能不支持服务器启用的TLS版本:

  • 在Mosquitto配置文件中明确兼容版本:
    listener 8883
    protocol mqtt
    cafile /etc/mosquitto/certs/ca.crt
    certfile /etc/mosquitto/certs/server.crt
    keyfile /etc/mosquitto/certs/server.key
    tls_version tlsv1.2 tlsv1.3
    
  • 用mosquitto_sub指定对应版本:
    mosquitto_sub -h 你的地址 -p 8883 -t "test/topic" --cafile ca.crt --tls-version tlsv1.2
    

4. 服务器证书链不完整

若服务器证书由中间CA签发,但Mosquitto仅配置了服务器证书,严格验证的mosquitto_sub会失败,而ESP32可能跳过了该检查:

  • 合并中间CA与服务器证书:
    cat server.crt intermediate.crt > fullchain.crt
    
  • 修改Mosquitto配置的certfile为该fullchain.crt路径

5. ESP32跳过了证书验证

ESP32能连接可能是代码中禁用了证书验证(如mqttClient.setInsecure(true)),但mosquitto_sub默认严格验证:

  • 临时排查:用--insecure跳过验证测试
    mosquitto_sub -h 你的地址 -p 8883 -t "test/topic" --insecure
    
    注意:生产环境禁止使用--insecure

快速验证步骤

  1. 用OpenSSL测试SSL连接:
    openssl s_client -connect 你的VPS地址:8883 -CAfile ca.crt
    
    查看Verify return code,若为0 (ok)则证书无问题,问题在mosquitto_sub参数;非0则根据错误码排查(如20代表无法获取本地 issuer,说明CA证书错误)
  2. 开启Mosquitto详细日志:在配置文件中添加log_type all,重启后查看SSL握手细节,定位具体失败点

内容的提问来源于stack exchange,提问作者dubbobobo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:00:16