Nifi集群配置ZooKeeper SSL连接报NotSslRecordException求助
解决ZooKeeper 3.5.3与NiFi SSL连接的NotSslRecordException问题
这个错误本质是一端尝试建立SSL连接,另一端没有启用SSL或者配置不兼容,结合你使用的ZK 3.5.3(早期支持SSL的版本),可以按以下步骤排查修复:
1. 确认ZooKeeper服务器端的SSL配置是否正确
ZK 3.5.x版本启用SSL需要修改zoo.cfg,注意参数和旧版本完全不同,必须配置以下核心项:
# 使用Netty作为连接工厂(必须,默认的NIOServerCnxnFactory不支持SSL) serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory # 密钥库配置(ZK服务器的证书存储) ssl.keyStore.location=/path/to/zookeeper.keystore.jks ssl.keyStore.password=your_keystore_password # 信任库配置(用于验证客户端证书) ssl.trustStore.location=/path/to/zookeeper.truststore.jks ssl.trustStore.password=your_truststore_password # 客户端认证可选(如果需要强制客户端验证设为required) ssl.clientAuth=optional
注意:3.5.3版本中
ssl.*参数不需要加zookeeper.前缀,后续版本才调整为zookeeper.ssl.*,别搞错了!
2. 检查NiFi端的ZK客户端SSL配置
在NiFi的nifi.properties中,确保ZK相关的SSL参数正确配置:
# 开启ZK SSL nifi.zookeeper.ssl.enabled=true # NiFi作为ZK客户端的密钥库和信任库 nifi.zookeeper.ssl.keyStore=/path/to/nifi.keystore.jks nifi.zookeeper.ssl.keyStorePassword=your_nifi_keystore_pw nifi.zookeeper.ssl.trustStore=/path/to/nifi.truststore.jks nifi.zookeeper.ssl.trustStorePassword=your_nifi_truststore_pw # 确保ZK连接字符串正确(不需要改端口,SSL和非SSL共用2181,通过配置区分) nifi.zookeeper.connect.string=zk-node-ip:2181
另外要注意:NiFi自带的ZK客户端版本要和ZK服务器版本兼容,比如你用ZK 3.5.3,NiFi最好用1.9.x或以上版本,避免客户端不支持SSL特性。
3. 验证证书信任链的完整性
NotSslRecordException也可能是证书不被信任导致的:
- 将ZK服务器的证书导入到NiFi的信任库中
- 如果ZK开启了
ssl.clientAuth=required,需要将NiFi的证书导入到ZK的信任库中 - 检查证书的CN字段是否匹配主机名,避免主机名验证失败(如果不需要主机名验证,可以在NiFi中添加
nifi.zookeeper.ssl.hostname-verification=false,但生产环境不推荐)
4. 测试ZK SSL连接的可用性
先脱离NiFi,直接用ZK自带的客户端测试SSL连接是否正常,执行命令:
zkCli.sh -server zk-node-ip:2181 -ssl \ -keyStore /path/to/nifi.keystore.jks \ -keyStorePassword your_nifi_keystore_pw \ -trustStore /path/to/nifi.truststore.jks \ -trustStorePassword your_nifi_truststore_pw
如果这个命令能成功连接ZK,说明ZK端配置没问题,问题出在NiFi;如果连接失败,重点排查ZK的配置和证书。
5. 考虑升级ZooKeeper版本
ZK 3.5.3是较早的支持SSL的版本,存在一些已知的SSL相关bug(比如Netty兼容性问题、参数解析错误),建议升级到3.5.9或更高的稳定版本,这些版本修复了很多早期SSL的问题,能避免一些莫名其妙的连接错误。
内容的提问来源于stack exchange,提问作者CMPE
相关产品推荐
相关产品推荐

