如何使用自签名SSL证书安全连接MQTT与Kafka?Mosquitto连接器配置故障求助
解决kafka-connect-mqtt自签名证书连接问题及相关验证
问题背景
我在Ubuntu服务器部署了Mosquitto broker,用kafka-connect-mqtt连接器实现MQTT与Kafka的连接。用已签名证书时连接器正常工作,但自签名证书无法连接本地服务器。连接器以独立模式运行,配置如下:
connector.class=com.evokly.kafka.connect.mqtt.MqttSourceConnector tasks.max=1 kafka.topic=kafkaSSL mqtt.client_id=mqttSSLClient-15 mqtt.clean_session=true mqtt.connection_timeout=30 mqtt.keep_alive_interval=60 mqtt.server_uris=ssl://192.168.0.2:8883 mqtt.topic=mqttSSL mqtt.ssl.ca_cert=/home/ca.crt mqtt.ssl.cert=/home/client.crt mqtt.ssl.key=/home/client.key
运行时抛出SSL相关异常,Mosquitto日志显示OpenSSL错误:error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error,客户端因协议错误断开。
现在需要解决两个问题:
- 如何验证连接器是否能连接服务器的8883端口?
- 当前Mosquitto配置文件存在哪些缺失项?
解答
1. 验证8883端口连通性及SSL握手
可以用以下几种方式快速排查:
- 用
openssl s_client测试SSL握手:
在连接器所在机器执行这条命令,模拟客户端和Mosquitto的SSL完整握手流程:
如果握手成功,会输出SSL连接的详细证书链、会话信息;如果失败,会直接抛出对应SSL错误,帮你定位是证书有效性问题还是端口连通问题。openssl s_client -connect 192.168.0.2:8883 -CAfile /home/ca.crt -cert /home/client.crt -key /home/client.key -tls1_2 - 用
nc测试端口基础连通性:
先确认端口是否开放可访问,执行:
若返回成功提示,说明TCP层面能连通;若失败,先检查Ubuntu防火墙(比如nc -zv 192.168.0.2 8883ufw)是否放行8883端口,或是Mosquitto是否真的在监听该端口。 - 用官方MQTT客户端测试:
用mosquitto_sub自带工具,用相同证书参数连接测试:
如果这个客户端能成功订阅,说明证书和Mosquitto配置没问题,问题出在kafka-connect-mqtt连接器的配置或依赖上。mosquitto_sub -h 192.168.0.2 -p 8883 -t mqttSSL --cafile /home/ca.crt --cert /home/client.crt --key /home/client.key --tls-version tlsv1.2
2. Mosquitto配置文件的缺失项分析
你当前的Mosquitto配置:
listener 8883 cafile home/ca.crt certfile home/server.crt keyfile home/server.key require certificate true tls_version tls1.2
存在几个关键问题:
- 证书路径使用相对路径,易导致找不到文件:
cafile home/ca.crt这类相对路径会让Mosquitto从启动时的工作目录查找证书,大概率找不到文件。必须改成绝对路径:cafile /home/ca.crt certfile /home/server.crt keyfile /home/server.key - 缺少客户端身份映射配置(开启证书验证后推荐添加):
当开启require certificate true时,Mosquitto需要识别客户端身份,建议添加配置让服务端使用客户端证书的CN作为用户名:use_identity_as_username true - 证书权限未配置(非配置项但影响运行):
要确保Mosquitto运行用户(通常是mosquitto)对证书文件有读取权限,执行以下命令修正:sudo chown mosquitto:mosquitto /home/ca.crt /home/server.crt /home/server.key sudo chmod 600 /home/ca.crt /home/server.crt /home/server.key - 可选:添加TLS cipher套件配置:
如果客户端(kafka-connect-mqtt依赖的Paho库)和Mosquitto的 cipher 套件不兼容,也会导致握手失败。可以指定兼容的TLS 1.2套件:tls_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305
另外,从错误栈的NullPointerException来看,问题还可能出在客户端证书与私钥不匹配上。你可以用以下命令验证两者是否配对:
openssl x509 -noout -modulus -in /home/client.crt | openssl md5 openssl rsa -noout -modulus -in /home/client.key | openssl md5
如果两个命令输出的MD5值一致,说明证书和私钥是配对的;若不一致,需要重新生成客户端证书。
内容的提问来源于stack exchange,提问作者habib




