Kafka 2.13-3.6.0配置SASL_SSL+SCRAM认证后启动失败,无法连接ZooKeeper
Kafka 2.13-3.6.0配置SASL_SSL+SCRAM认证后启动失败,无法连接ZooKeeper
看起来你遇到的核心问题是ZooKeeper默认启用了DIGEST-MD5认证机制,但你实际配置的是SCRAM,导致Kafka和ZK之间的SASL握手完全不匹配,才会报出那个无法获取密码的错误。咱们一步步来修正这些配置问题:
1. 修正ZooKeeper配置文件(zookeeper.properties)
首先给ZK明确指定要使用的SASL机制,不然它会默认用DIGEST-MD5,和你的SCRAM配置冲突。添加以下参数:
# 指定ZK支持的SASL机制为SCRAM-SHA-256 sasl.enabled.mechanisms=SCRAM-SHA-256 # 匹配你日志里显示的realm(日志里是zk-sasl-md5) sasl.realm=zk-sasl-md5
另外注意你之前的配置里有个拼写错误:uorum.cnxn.threads.size=20 应该改成 quorum.cnxn.threads.size=20,别漏了修正这个小问题。
2. 修正ZooKeeper的JAAS配置文件(你之前写错成zookepr_jass.conf,应该是zookeeper_jaas.conf)
这里有两个关键错误:一是用了Kafka的SCRAM LoginModule,二是QuorumServer的用户凭证格式不对。ZK需要用自己的SCRAM模块,而且Server端的用户凭证格式是user_<你的用户名>="<密码>",修正后的配置如下:
QuorumServer { org.apache.zookeeper.server.auth.SCRAMLoginModule required user_user="sepultura1"; # 格式是user_<用户名>,值为密码 }; QuorumLearner { org.apache.zookeeper.server.auth.SCRAMLoginModule required username="user" password="sepultura1"; }; Server { org.apache.zookeeper.server.auth.SCRAMLoginModule required user_user="sepultura1"; }; Client { org.apache.zookeeper.server.auth.SCRAMLoginModule required username="user" password="sepultura1"; };
解释一下:之前你用的org.apache.kafka.common.security.scram.ScramLoginModule是给Kafka服务用的,ZooKeeper有自己的SCRAM处理模块,必须换成上面这个ZK专属的,否则无法正确解析SCRAM凭证。
3. 完善Kafka的server.properties,明确ZK连接的SASL规则
要让Kafka知道用SCRAM去连接ZK,得添加这些配置:
# 启用ZK的SASL客户端认证 zookeeper.sasl.client=true # 指定连接ZK的SASL用户名 zookeeper.sasl.client.username=user # 指定Kafka连接ZK时使用的JAAS上下文(对应你kafka.server.jaas.conf里的zkClient段) zookeeper.sasl.login.context=zkClient # 启用ZK ACL(如果你的场景需要的话) zookeeper.set.acl=true
4. 确保JAAS配置文件被正确加载
启动ZK和Kafka的时候,一定要通过JVM参数指定JAAS配置文件的路径:
- 启动ZooKeeper时,添加参数:
-Djava.security.auth.login.config=/你的路径/zookeeper_jaas.conf - 启动Kafka时,添加参数:
-Djava.security.auth.login.config=/你的路径/kafka.server.jaas.conf
最后验证步骤
先启动ZooKeeper,查看它的日志,确认没有SASL相关的错误;然后再启动Kafka,检查日志里是否成功连接到ZK了。
备注:内容来源于stack exchange,提问作者Petr Kostroun




