zookeeper和kafka安全机制:java.lang.ClassNotFoundException: kafka.security.auth.SimpleAclAuthorizer

本文记录了在配置Kafka安全机制时遇到的问题及解决过程。首先,由于Kafka版本更新,SimpleAclAuthorizer已被弃用,替换为AclAuthorizer。修正配置后,又出现认证失败的问题,原因是KafkaServer配置文件中的username、password和user_admin的密码不一致。调整为相同后,问题得到解决。

1、找不到验证类文件

在给项目支撑时反馈到项目一直存在kafka的报错问题,看能不能解决一下,排查项目发现配置中开启了kafka的安全机制(这个我也看不太懂,不了解开发,大致好像是开启了,也找不到关闭的参数),硬着头皮尝试开启kafka的安全机制试试

zk配置如下:
都是单节点的,没做集群

cat conf/zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/app/zookeeper/dataDir/
clientPort=2181
#server.1=0.0.0.0:2888:3888
##############
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000



cat conf/zk_server_jaas.conf 
Server {
  org.apache.kafka.common.security.plain.PlainLoginModule required 
    username="admin" 
    password="admin-2022" 
    user_kafka="kafka-2022" 
    user_producer="producer-2022";
};

kafka配置:

cat config/server.properties 
broker.id=1
listeners=PLAINTEXT://192.168.6.61:9092
log.dirs=/app/kafka/logs
num.partitions=3
zookeeper.connect=192.168.6.61:2181
##########
listeners=SASL_PLAINTEXT://0.0.0.0:9092
advertised.listeners=SASL_PLAINTEXT://192.168.6.61:9092
security.inter.broker.protocol=SASL_PLAINTEXT  
sasl.enabled.mechanisms=PLAIN  
sasl.mechanism.inter.broker.protocol=PLAIN  
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
allow.everyone.if.no.acl.found=true


cat config/kafka_server_jaas.conf 
KafkaServer {
  org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="admin@1234"
    user_admin="admin-1234"
    user_producer="kafka@123"
    user_consumer="kafka@123";
};

KafkaClient {
  org.apache.kafka.common.security.plain.PlainLoginModule required
    username="kafka"
    password="kafka-2022";
};

zk正常启动,但是启动kafka时一直报错,找不到安全机制相关的类文件
在这里插入图片描述

[2022-07-14 17:13:07,934] INFO Registered kafka:type=kafka.Log4jController MBean (kafka.utils.Log4jControllerRegistration$)
[2022-07-14 17:13:08,288] INFO Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation (org.apache.zookeeper.common.X509Util)
[2022-07-14 17:13:08,303] ERROR Exiting Kafka due to fatal exception (kafka.Kafka$)
java.lang.ClassNotFoundException: kafka.security.auth.SimpleAclAuthorizer
 at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
 at java.lang.Class.forName0(Native Method)
 at java.lang.Class.forName(Class.java:348)
 at org.apache.kafka.common.utils.Utils.loadClass(Utils.java:419)
 at org.apache.kafka.common.utils.Utils.newInstance(Utils.java:408)
 at kafka.security.authorizer.AuthorizerUtils$.createAuthorizer(AuthorizerUtils.scala:31)
 at kafka.server.KafkaConfig.<init>(KafkaConfig.scala:1658)
 at kafka.server.KafkaConfig.<init>(KafkaConfig.scala:1471)
 at kafka.Kafka$.buildServer(Kafka.scala:67)
 at kafka.Kafka$.main(Kafka.scala:87)
 at kafka.Kafka.main(Kafka.scala)

最明显的报错:java.lang.ClassNotFoundException: kafka.security.auth.SimpleAclAuthorizer
思来想去没有道理,最后翻遍了博客,终于在外的一片帖子上找到了答案
在这里插入图片描述
意思就是说kafka3.0之后版本弃用了SimpleAclAuthorizer验证,改为kafka.security.authorizer.AclAuthorizer

于是乎修改配置文件

cat config/server.properties 
broker.id=1
listeners=PLAINTEXT://192.168.6.61:9092
log.dirs=/app/kafka/logs
num.partitions=3
zookeeper.connect=192.168.6.61:2181
##########
listeners=SASL_PLAINTEXT://0.0.0.0:9092
advertised.listeners=SASL_PLAINTEXT://192.168.6.61:9092
security.inter.broker.protocol=SASL_PLAINTEXT  
sasl.enabled.mechanisms=PLAIN  
sasl.mechanism.inter.broker.protocol=PLAIN  
#authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
authorizer.class.name=kafka.security.authorizer.AclAuthorizer # 修改验证机制
allow.everyone.if.no.acl.found=true

该问题解决,又一个新问题产生

2、认证失败

2022-07-14 19:46:19,945] INFO [SocketServer listenerType=ZK_BROKER, nodeId=1] Failed authentication with /192.168.6.61 (Authentication failed: Invalid username or password) (org.apache.kafka.common.network.Selector)
[2022-07-14 19:46:20,247] INFO [Controller id=1, targetBrokerId=1] Failed authentication with node1/192.168.6.61 (Authentication failed: Invalid username or password) (org.apache.kafka.common.network.Selector)
[2022-07-14 19:46:20,247] ERROR [Controller id=1, targetBrokerId=1] Connection to node 1 (node1/192.168.6.61:9092) failed authentication due to: Authentication failed: Invalid username or password (org.apache.kafka.clients.NetworkClient)
[2022-07-14 19:46:20,355] INFO [SocketServer listenerType=ZK_BROKER, nodeId=1] Failed authentication with /192.168.6.61 (Authentication failed: Invalid username or password) (org.apache.kafka.common.network.Selector)

根据报错大致推断是账号或密码错误
这里是由于我的kafka配置问题

cat config/kafka_server_jaas.conf 
KafkaServer {
  org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="admin@1234"
    user_admin="admin-1234"
    user_producer="kafka@123"
    user_consumer="kafka@123";
};

KafkaClient {
  org.apache.kafka.common.security.plain.PlainLoginModule required
    username="kafka"
    password="kafka-2022";
};

上面配置文件中两处密码不同导致的

    username="admin"
    password="admin@1234"
    user_admin="admin-1234"

kafka安全机制中要求KafkaServer 中配置的usernamepassworduser_admin,这里要保持一致
passworduser_admin的密码必须相同

cat config/kafka_server_jaas.conf 
KafkaServer {
  org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="admin@1234"
    user_admin="admin@1234" # 这里必须和上面一致
    user_producer="kafka@123"
    user_consumer="kafka@123";
};

KafkaClient {
  org.apache.kafka.common.security.plain.PlainLoginModule required
    username="kafka"
    password="kafka-2022";
};

终于大功告成!

<think> 我们正在解决启动ZooKeeper时出现的`java.lang.ClassNotFoundException: org.apache.zookeeper.server.quorum.QuorumPeerMain`错误。这个错误表明Java虚拟机无法找到`QuorumPeerMain`类,这通常是因为ZooKeeper的jar文件缺失或路径配置不正确。 根据引用内容,特别是引用[2][3],我们可以分析原因并给出解决方案: ### 原因分析 1. **ZooKeeper的jar包缺失或路径错误**:启动脚本可能无法正确加载ZooKeeper的jar文件。 2. **环境变量配置问题**:可能`JAVA_HOME`未正确配置,或者ZooKeeper的启动脚本中引用的jar路径不正确。 3. **启动脚本错误**:在Kafka中启动ZooKeeper时,使用的脚本`zookeeper-server-start.bat`可能依赖的库路径不正确。 ### 解决方案 #### 步骤1:确认ZooKeeper的jar包存在 确保在Kafka的libs目录下存在ZooKeeper的jar包(例如:`zookeeper-3.5.9.jar`)。路径通常为: ``` kafka安装目录/libs/zookeeper-*.jar ``` 如果该jar包不存在,你需要重新下载Kafka或者单独下载ZooKeeper的jar包并放入libs目录。 #### 步骤2:检查启动脚本(针对Kafka集成的ZooKeeper) 在Kafka中,启动ZooKeeper的脚本是`bin/windows/zookeeper-server-start.bat`。我们需要检查该脚本中设置的类路径(classpath)是否正确。 打开`zookeeper-server-start.bat`,查找设置`CLASSPATH`的地方。正常情况下,它应该包含`zookeeper-*.jar`。例如: ```batch set CLASSPATH=%BASE_DIR%\libs\* ``` 如果脚本中没有正确设置类路径,你可以手动修改,添加ZooKeeper的jar包路径。 #### 步骤3:检查Java环境变量 根据引用[3],确保`JAVA_HOME`环境变量已正确设置,并且指向的路径存在。在命令行中执行: ```cmd echo %JAVA_HOME% ``` 查看输出的路径是否正确。如果不正确,请重新设置。 #### 步骤4:手动指定类路径运行 如果上述步骤无效,可以尝试手动指定类路径来启动ZooKeeper。在命令行中执行: ```cmd java -cp "G:\kafka_2.13-2.8.0\libs\*" org.apache.zookeeper.server.quorum.QuorumPeerMain .\config\zookeeper.properties ``` 请将路径`G:\kafka_2.13-2.8.0\libs\*`替换为你实际的Kafka的libs目录路径。 #### 步骤5:重新安装或下载完整包 如果仍然无法解决,可能是Kafka发行包损坏,建议重新下载Kafka并解压。 ### 总结 该错误主要是由于类路径中缺少ZooKeeper的jar包引起的,重点检查: 1. Kafka的libs目录下是否有ZooKeeper的jar包。 2. 启动脚本中的类路径设置是否正确。 3. Java环境变量是否正确设置。 通过以上步骤,通常可以解决该问题。 §§相关问题§§ 1. 如何正确设置Kafka的启动脚本以避免类路径问题? 2. ZooKeeperKafka版本不兼容会导致哪些问题? 3. 在Windows系统中启动ZooKeeper时,如何检测并修复环境变量问题?[^3][^5] </think> ### 解决 `ClassNotFoundException: QuorumPeerMain` 错误 当执行 `.\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties` 时出现 `java.lang.ClassNotFoundException: org.apache.zookeeper.server.quorum.QuorumPeerMain` 错误,根本原因是 **ZooKeeper 核心类文件缺失或类路径配置错误**。以下是系统级解决方案: --- ### 一、错误原因分析 1. **JAR 包缺失** Kafka 附带的 ZooKeeper 缺少核心 JAR 文件(如 `zookeeper-*.jar`)。 2. **类路径配置错误** 启动脚本未正确加载 ZooKeeper 的 JAR 文件(参考 Kafka 标准启动方式[^2])。 3. **版本不兼容** ZooKeeperKafka 版本不匹配(如 Kafka 内置 ZooKeeper 被破坏)。 4. **文件损坏** 下载的 Kafka/ZooKeeper 安装包不完整。 --- ### 二、解决方案步骤 #### ✅ 步骤 1:验证 JAR 文件存在性 检查 Kafka 安装目录下的 JAR 文件: ```powershell # 进入 Kafka 的 libs 目录 cd G:\kafka_2.13-3.2.1\libs # 查找 ZooKeeper JAR(关键文件) dir zookeeper-*.jar ``` - ✅ **正常应有输出**:`zookeeper-3.8.0.jar`(版本可能不同) - ❌ **异常情况**:无输出或文件大小异常(< 1MB) #### ✅ 步骤 2:修复类路径配置 修改 `zookeeper-server-start.bat` 启动脚本: ```batch @echo off rem 原始内容上方添加以下两行: set BASE_DIR=%~dp0.. set CLASSPATH=%BASE_DIR%\libs\* rem 原始启动命令保持不变: call %BASE_DIR%\bin\windows\kafka-run-class.bat org.apache.zookeeper.server.quorum.QuorumPeerMain %* ``` > **原理**:显式指定 `CLASSPATH` 加载所有 libs 下的 JAR(参考 Kafka 标准启动逻辑[^2]) #### ✅ 步骤 3:手动指定类路径启动(临时测试) ```powershell java -cp "G:\kafka\libs\*" org.apache.zookeeper.server.quorum.QuorumPeerMain .\config\zookeeper.properties ``` - 替换 `G:\kafka\libs\*` 为你的实际路径 - 若能启动,证明步骤 2 的修复有效 #### ✅ 步骤 4:重新下载完整安装包 如果缺 JAR 文件: 1. 访问 [Apache Kafka 官网](https://kafka.apache.org/downloads) 2. 下载 **完整二进制包**(名称含 `tgz` 或 `zip`,约 100MB) 3. 替换损坏的 libs 目录 #### ✅ 步骤 5:检查版本兼容性 确保组件版本匹配: ```mermaid graph LR A[Kafka版本] --> B[内置ZooKeeper版本] B --> C[所需QuorumPeerMain类] ``` - **兼容查询**:参考 [Kafka 官方兼容性列表](https://cwiki.apache.org/confluence/display/KAFKA/Compatibility+Matrix) --- ### 三、预防措施 1. **验证安装包完整性** 下载后检查文件哈希值: ```powershell CertUtil -hashfile kafka_2.13-3.2.1.tgz SHA256 ``` 对比官网提供的校验值(如 `d0d7f4d7...`) 2. **使用独立 ZooKeeper** 若问题持续,改用独立 ZooKeeper(参考独立安装流程[^3]): ```powershell # 独立启动 ZooKeeper .\zookeeper-server-start.bat ..\conf\zoo.cfg ``` 3. **环境变量检查** 确保 `JAVA_HOME` 指向有效 JDK(非 JRE),ZooKeeper 需要 JDK 编译支持[^3]。 > **关键提示**:90% 的此类错误通过**步骤 2(修复类路径)** 或**步骤 4(重下安装包)** 解决。优先检查 libs 目录的 JAR 完整性!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值