Kafka与SpringBoot消费者SSL握手失败问题求助
问题排查:Kafka SSL握手失败(Unrecognized SSL message, plaintext connection?)
针对你遇到的SSL握手错误,以下是几个关键排查方向:
1. 验证Broker的9093端口是否确实提供SSL服务
首先确认Broker的9093端口正在处理SSL流量,而非明文请求:
openssl s_client -connect 192.168.xx.xx:9093
- 如果返回SSL握手成功的信息(包含证书详情、会话信息),说明Broker端口配置正常;
- 如果连接后直接收到非SSL数据,或者提示“plaintext connection”,说明Broker的9093端口被错误配置为PLAINTEXT,需要重新检查
server.properties中的listeners配置,确保SSL://0.0.0.0:9093没有被覆盖或写错。
2. 检查消费者SSL配置的细节
端点标识验证
如果Broker证书的CN名称和你连接的IP不一致,会导致端点验证失败,进而触发类似错误。可以临时关闭验证(测试环境用,生产不建议):
spring.kafka.ssl.endpoint-identification-algorithm=
密钥库类型配置
如果你的密钥库/信任库是PKCS12格式而非默认的JKS,必须显式指定类型:
spring.kafka.ssl.key-store-type=PKCS12 spring.kafka.ssl.trust-store-type=PKCS12
3. 确认密钥库/信任库的完整性
服务器端密钥库检查
kafka.server.keystore.jks必须包含服务器私钥和对应的证书链,而不只是证书。用以下命令检查:
keytool -list -v -keystore /home/kafka/kafka/ssl/kafka.server.keystore.jks
输出中必须存在PrivateKeyEntry类型的条目,否则Broker无法完成SSL握手。
客户端密钥库检查
同理,kafka.client.keystore.jks也需要包含客户端私钥,用相同命令检查是否有PrivateKeyEntry。
证书一致性
确认所有信任库中的root.crt是签署server/client证书的同一CA根证书,且证书未过期:
keytool -printcert -file root.crt
查看Valid from和Valid until字段确认有效期。
4. 补充Broker的SSL协议/套件配置
如果消费者和Broker的SSL协议版本不兼容,也会导致握手失败。在server.properties中添加明确的协议和套件配置:
ssl.enabled.protocols=TLSv1.2,TLSv1.3 ssl.cipher.suites=ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-CHACHA20-POLY1305,ECDHE-RSA-CHACHA20-POLY1305
消费者端同步配置:
spring.kafka.ssl.enabled-protocols=TLSv1.2,TLSv1.3
5. 排查网络层面的干扰
确认9093端口没有被防火墙、代理或负载均衡器修改为明文流量。可以在Broker所在机器上用tcpdump抓包,查看收到的第一个数据包是否为SSL Client Hello:
tcpdump -i any port 9093 -A | head -20
如果看到明文内容而非SSL握手的二进制数据,说明网络中间设备存在问题。
内容的提问来源于stack exchange,提问作者Samuel Waithaka
相关产品推荐
相关产品推荐

