Docker环境下Kafka与ZooKeeper SASL认证失败求助
排查Kafka-ZooKeeper SASL DIGEST-MD5认证失败问题
针对你遇到的the quorum member's saslToken is null错误,本质是ZooKeeper端的SASL认证配置未正确生效,导致Kafka作为客户端发起认证时,ZK没有返回有效的响应。以下是分步骤的排查和修复方案:
1. 检查ZooKeeper JAAS配置(zookeeper.jaas)
ZK的Server端必须配置DIGEST-MD5的Login模块,且用户信息与Kafka的客户端配置匹配:
Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_kafka="zk_kafka_secret"; # 格式为user_<用户名>="<密码>" };
注意:这里的kafka是Kafka连接ZK时要用的用户名,密码自定义,后续Kafka配置要完全对应。
2. 修正ZooKeeper核心配置(zookeeper.properties)
必须启用SASL认证并指定认证提供者:
# 启用SASL认证 authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider # 强制客户端使用SASL认证 requireClientAuthScheme=sasl # SASL会话刷新时间 jaasLoginRenew=3600000 # 禁用其他非SASL认证(如digest),避免冲突 # digestAuthenticationProvider.enabled=false
3. 调整Kafka JAAS配置(kafka.jaas)
Kafka作为ZK客户端的部分,必须使用DIGEST-MD5,且用户名密码与ZK的JAAS一致:
# ZK客户端认证配置 Client { org.apache.zookeeper.client.ZooKeeperSaslClient required username="kafka" # 对应ZK JAAS里的user_<用户名>的用户名部分 password="zk_kafka_secret"; # 和ZK JAAS里的密码完全一致 }; # Kafka Broker的SASL_SSL SCRAM配置(保留你的原有正确配置) KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required username="kafka_broker" password="broker_scram_secret"; };
4. Docker Compose配置修正
确保容器正确加载JAAS配置文件,并传递必要的JVM参数:
version: '3.8' services: zookeeper: image: confluentinc/cp-zookeeper:latest container_name: zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 # 指定ZK的JAAS配置文件路径 ZOOKEEPER_OPTS: "-Djava.security.auth.login.config=/etc/zookeeper/zookeeper.jaas" volumes: # 挂载本地的zookeeper.jaas和zookeeper.properties到容器内 - ./zookeeper/zookeeper.jaas:/etc/zookeeper/zookeeper.jaas - ./zookeeper/zookeeper.properties:/etc/kafka/zookeeper.properties kafka: image: confluentinc/cp-kafka:latest container_name: kafka depends_on: [zookeeper] environment: KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181" # 指定Kafka的JAAS配置文件路径 KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/kafka.jaas" # 你的SASL_SSL和SCRAM配置(保留原有正确项) KAFKA_LISTENERS: "SASL_SSL://0.0.0.0:9092" KAFKA_ADVERTISED_LISTENERS: "SASL_SSL://<你的公网IP>:9092" KAFKA_SECURITY_INTER_BROKER_PROTOCOL: "SASL_SSL" KAFKA_SASL_ENABLED_MECHANISMS: "SCRAM-SHA-512" KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: "SCRAM-SHA-512" # SSL相关配置(证书、密钥等) KAFKA_SSL_KEYSTORE_LOCATION: "/etc/kafka/secrets/kafka.keystore.jks" KAFKA_SSL_KEYSTORE_PASSWORD: "ssl_secret" KAFKA_SSL_KEY_PASSWORD: "ssl_secret" KAFKA_SSL_TRUSTSTORE_LOCATION: "/etc/kafka/secrets/kafka.truststore.jks" KAFKA_SSL_TRUSTSTORE_PASSWORD: "ssl_secret" volumes: # 挂载Kafka的JAAS配置、SSL证书等 - ./kafka/kafka.jaas:/etc/kafka/kafka.jaas - ./kafka/secrets:/etc/kafka/secrets ports: - "9092:9092"
5. 验证方法
先启动ZK容器,然后用ZK客户端测试SASL认证是否生效:
# 编写一个临时的client.jaas,内容和Kafka的Client模块一致 echo 'Client { org.apache.zookeeper.client.ZooKeeperSaslClient required username="kafka" password="zk_kafka_secret"; };' > client.jaas # 进入ZK容器执行客户端命令 docker exec -it zookeeper zkCli.sh -server localhost:2181 -jaas.conf /tmp/client.jaas # 成功连接则说明ZK的SASL配置正常
如果以上配置调整后仍有问题,检查:
- 所有容器内的配置文件路径是否正确,挂载是否成功(可以用
docker exec进入容器查看文件内容) - ZK集群所有节点的JAAS配置是否完全一致
- Java的
java.security文件中是否启用了SASL提供者(默认路径/usr/lib/jvm/java-11-openjdk-amd64/conf/security/java.security,确保security.provider.5=com.sun.security.sasl.Provider存在)
内容的提问来源于stack exchange,提问作者FoxxDE
相关产品推荐
相关产品推荐

