Kafka KRaft集群SASL_SSL配置问题:SASL握手时METADATA请求错误
我搭建了一个基于mTLS正常运行的Kafka KRaft集群,现在想切换为SASL_SSL配置,但Broker监听器出现如下认证失败错误:
INFO [SocketServer listenerType=BROKER, nodeId=1] Failed authentication with /172.31.0.228 (channelId=172.31.21.224:9094-172.31.0.228:48788-0) (Unexpected Kafka request of type METADATA during SASL handshake.) (org.apache.kafka.common.network.Selector)
集群包含3个节点,Broker与Controller合一。目前未连接任何消费者/生产者,错误由Broker间通信触发,但Controller监听器运行正常。
已尝试多轮配置调整,认为当前配置接近正确,已知该错误可能与协议不匹配有关,但所有配置均已设置为使用SASL_SSL,错误描述不够清晰,无法明确排查方向。
以下是当前的server.properties配置:
# server.properties configuration # Listeners listeners=CONTROLLER://0.0.0.0:9093,BROKER://0.0.0.0:9094 advertised.listeners=BROKER://<BROKER_HOST>:9094 listener.security.protocol.map=CONTROLLER:SASL_SSL,BROKER:SASL_SSL controller.listener.names=CONTROLLER inter.broker.listener.name=BROKER # SASL sasl.enabled.mechanisms=PLAIN sasl.mechanism.controller.protocol=PLAIN sasl.mechanism.inter.broker.protocol=PLAIN # JAAS listener.name.controller.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="admin" \ password="test123" \ user_admin="test123"; listener.name.broker.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="admin" \ password="test123" \ user_admin="test123"; # SSL security.protocol = SASL_SSL ssl.enabled.protocols=TLSv1.3,TLSv1.2 ssl.keystore.type=PEM ssl.keystore.location=/opt/kafka/certs/keystore.pem ssl.key.password=<password> ssl.truststore.type=PEM ssl.truststore.location=/opt/kafka/certs/truststore.pem
问题排查与修复方案
核心原因
该错误表明Broker节点在BROKER监听器的SASL握手流程未完成时,收到了METADATA请求,本质是节点间的安全协议配置不一致、JAAS/SSL配置未生效或网络可达性问题。
具体修复步骤
修正
advertised.listeners配置
每个节点的<BROKER_HOST>必须替换为其他节点可访问的真实IP或主机名,不能保留占位符。云环境或容器部署中,需确认节点间网络端口(9094)互通。移除全局
security.protocol配置security.protocol是客户端配置,Broker端无需设置,该配置会干扰监听器的安全协议映射逻辑。直接删除security.protocol = SASL_SSL这一行。验证SSL证书一致性
确保所有节点的keystore和truststore文件完全一致,证书可互相验证。用以下命令检查单节点SSL端口是否正常:openssl s_client -connect <BROKER_HOST>:9094 -tls1_3若返回证书信息且无错误,说明SSL配置单节点有效。
确认JAAS配置全节点同步
所有节点的listener.name.broker.plain.sasl.jaas.config必须完全一致,确保用户名、密码以及授权用户的配置无差异。重启所有节点
修改配置后必须重启全部3个Broker/Controller节点,确保新配置完全生效。
验证方法
重启完成后,查看Broker日志是否仍存在认证失败错误。可通过创建测试主题验证Broker间通信:
./bin/kafka-topics.sh --create --topic test-topic --partitions 3 --replication-factor 3 --bootstrap-server <BROKER_HOST>:9094 --command-config client.properties
其中client.properties需包含SASL_SSL客户端配置:
security.protocol=SASL_SSL sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="test123"; ssl.truststore.type=PEM ssl.truststore.location=/opt/kafka/certs/truststore.pem
内容的提问来源于stack exchange,提问作者eazy-b

