使用自签证书时Mosquitto_pub出现TLS错误alert unknown ca的排查咨询
问题现象
执行发布命令:
mosquitto_pub -h mqtt.sustainable-data-platform.org -p 8883 --cafile ./intermediate-mq.cert.pem -t test -m "fff aaa" -u <user> -P <pssw>
出现以下OpenSSL错误:
06-27T17:12:03: OpenSSL Error[0]: error:14094413:SSL routines:ssl3_read_bytes:sslv3 alert unsupported certificate 06-27T17:12:03: OpenSSL Error[1]: error:140940E5:SSL routines:ssl3_read_bytes:ssl handshake failure 06-27T17:13:30: OpenSSL Error[0]: error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca
错误含义解释
tlsv1 alert unknown ca:客户端在SSL握手时,无法验证服务器证书的签发CA。也就是说,客户端提供的CA证书(intermediate-mq.cert.pem)无法与服务器证书的签发者建立信任链,或者服务器发送的证书链不完整,导致客户端不认可这个CA的合法性。
调试与检查要点
验证服务器证书与CA的签发关系
用以下命令检查服务器证书mqtt.sdp.cert.pem是否由你使用的中间CA签发:openssl verify -CAfile ./intermediate-mq.cert.pem /etc/pki/CA/intermediate/certs/mqtt.sdp.cert.pem只有返回
OK才说明签发关系正确。确保服务器发送完整证书链
Mosquitto默认只发送certfile指定的证书,如果服务器证书是由中间CA签发的,需要把服务器证书和中间CA证书合并成完整链文件:cat /etc/pki/CA/intermediate/certs/mqtt.sdp.cert.pem /etc/pki/CA/intermediate/certs/intermediate-mq.cert.pem > /etc/pki/CA/intermediate/certs/fullchain.pem然后修改
mosquitto.conf的certfile指向这个完整链:certfile /etc/pki/CA/intermediate/certs/fullchain.pem检查证书Subject与Issuer的匹配性
从你提供的中间CA证书信息看,它的Issuer和Subject几乎一致(仅缺少L字段),说明这是一个自签名的中间CA。需要确认服务器证书mqtt.sdp.cert.pem的Issuer字段,与中间CA证书的Subject字段完全一致,否则客户端无法完成信任链验证。确认客户端与服务器的CA文件一致
检查本地的./intermediate-mq.cert.pem和服务器上的/etc/pki/CA/intermediate/certs/intermediate-mq.cert.pem是否为同一文件,可通过哈希值对比:# 本地计算哈希 sha256sum ./intermediate-mq.cert.pem # 服务器上计算哈希 sha256sum /etc/pki/CA/intermediate/certs/intermediate-mq.cert.pem两者哈希值必须完全相同。
排查SSL协议/加密套件兼容性
第一个错误sslv3 alert unsupported certificate可能是协议版本不兼容。在mosquitto.conf中指定TLS版本:tls_version tlsv1.2然后客户端命令中指定对应版本测试:
mosquitto_pub -h mqtt.sustainable-data-platform.org -p 8883 --cafile ./intermediate-mq.cert.pem --tls-version tlsv1.2 -t test -m "fff aaa" -u <user> -P <pssw>
关于--insecure参数的说明
--insecure仅用于跳过服务器证书的主机名/CN匹配验证,无法解决CA不被信任的问题。你的场景是客户端不认可签发CA,所以这个参数无效,必须通过正确配置信任链来解决。
内容的提问来源于stack exchange,提问作者BairDev

