Kafka AdminClient配置SCRAM
kafka2.7.0才支持通过API的方式,配置SCRAM。
因为我们使用的2.3.9版本,目前没有直接的JAVA API来调用。熟悉的味道,开始查看源代码。通过查看
kafka-configs.sh脚本,找到class的代码入口:
kafka.admin.ConfigCommand。这个类是通过scala编写的,然后编译成class文件,放在了kafka-client包内。然后我们尝试第一种方式,直接通过java代码调用scala代码的main方法:
public static void main(String[] args) throws NoSuchAlgorithmException {
long a = System.currentTimeMillis();
kafka.admin.ConfigCommand.main(args);
long b = System.currentTimeMillis();
System.out.println(b-a);
}
参数传递与命令行方式一样:
--zookeeper 172.30.233.149:2181 --alter --add-config SCRAM-SHA-256=[iterations=8192,password=cons-sec],SCRAM-SHA-512=[password=cons-sec] --entity-type users --entity-name consumer
本地main方法执行后,发现耗时很长,需要4-5s时间。
然后继续深入查看kafka.admin.ConfigCommand的源代码,其对entity-type users的情况大体思路是本地生成相应的加解密需要的相关信息,然后操作zk,所以就有了第二种方式的尝试。我们自己生产加密信息串,然后自己操作zk。
如下:
salt=aTM5MzJkYnJncXZib2pzb3l0b3kwaGJybg==,stored_key=KiMC/9Utm/9GIG2QQ/WY+CyqmiYq379QmucRMCDYWZc=,server_key=kiKf8pEwVNRM2r+ZQsyzQ2dlpGb6dWqZyj3+FqLksiQ=,iterations=8192
java代码如下:
ScramFormatter formatter = new ScramFormatter(ScramMechanism.SCRAM_SHA_256);
ScramCredential scramCredential = formatter.generateCredential("admin-sec", 8192);
String s = ScramCredentialUtils.credentialToString(scramCredential);
此种方式有待验证。