You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用自签名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,客户端因协议错误断开。

现在需要解决两个问题:

  1. 如何验证连接器是否能连接服务器的8883端口?
  2. 当前Mosquitto配置文件存在哪些缺失项?

解答

1. 验证8883端口连通性及SSL握手

可以用以下几种方式快速排查:

  • openssl s_client测试SSL握手
    在连接器所在机器执行这条命令,模拟客户端和Mosquitto的SSL完整握手流程:
    openssl s_client -connect 192.168.0.2:8883 -CAfile /home/ca.crt -cert /home/client.crt -key /home/client.key -tls1_2
    
    如果握手成功,会输出SSL连接的详细证书链、会话信息;如果失败,会直接抛出对应SSL错误,帮你定位是证书有效性问题还是端口连通问题。
  • nc测试端口基础连通性
    先确认端口是否开放可访问,执行:
    nc -zv 192.168.0.2 8883
    
    若返回成功提示,说明TCP层面能连通;若失败,先检查Ubuntu防火墙(比如ufw)是否放行8883端口,或是Mosquitto是否真的在监听该端口。
  • 用官方MQTT客户端测试
    mosquitto_sub自带工具,用相同证书参数连接测试:
    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
    
    如果这个客户端能成功订阅,说明证书和Mosquitto配置没问题,问题出在kafka-connect-mqtt连接器的配置或依赖上。

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

火山引擎 最新活动