本文分享自天翼云开发者社区《Kafka配置SASL_SSL认证传输加密》,作者:王****帅

一、SSL证书配置

1、生成证书

如我输入命令如下:依次是 密码—重输密码—名与姓—组织单位—组织名—城市—省份—国家两位代码—密码—重输密码,后面告警不用管,此步骤要注意的是,名与姓这一项必须输入域名,如 “localhost”,切记不可以随意写,我曾尝试使用其他字符串,在后面客户端生成证书认证的时候一直有问题。

keytool -keystore server.keystore.jks -alias localhost -validity 3650 -genkey
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: localhost
What is the name of your organizational unit?
[Unknown]: CH-kafka
What is the name of your organization?
[Unknown]: kafkadev
What is the name of your City or Locality?
[Unknown]: shanghai
What is the name of your State or Province?
[Unknown]: shanghai
What is the two-letter country code for this unit?
[Unknown]: CH
Is CN=localhost, OU=CH-kafka, O=kafkadev, L=shanghai, ST=shanghai, C=CH correct?
[no]: yes
Enter key password for <localhost>
(RETURN if same as keystore password):
Re-enter new password:
Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore server.keystore.jks -destkeystore server.keystore.jks -deststoretype pkcs12".

完成上面步骤,可使用命令 keytool -list -v -keystore server.keystore.jks 来验证生成证书的内容

2、生成CA

通过第一步,集群中的每台机器都生成一对公私钥,和一个证书来识别机器。但是,证书是未签名的,这意味着攻击者可以创建一个这样的证书来伪装成任何机器。

因此,通过对集群中的每台机器进行签名来防止伪造的证书。证书颁发机构(CA)负责签名证书。CA的工作机制像一个颁发护照的政府。政府印章(标志)每本护照,这样护照很难伪造。其他政府核实护照的印章,以确保护照是真实的。同样,CA签名的证书和加密保证签名证书很难伪造。因此,只要CA是一个真正和值得信赖的权威,client就能有较高的保障连接的是真正的机器。如下,生成的CA是一个简单的公私钥对和证书,用于签名其他的证书,下面为输入命令,依次提示输入为 密码—重输密码—国家两位代码—省份—城市—名与姓—组织名—组织单位—名与姓(域名)—邮箱 ,此输入步骤与上面生成证书世输入步骤相反,输入值要与第一步一致,邮箱可不输入

openssl req -new -x509 -keyout ca-key -out ca-cert -days 3650 Generating a 2048 bit RSA private key .........................................................................+++ ..................+++ writing new private key to 'ca-key' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CH State or Province Name (full name) []:shanghai Locality Name (eg, city) [Default City]:shanghai Organization Name (eg, company) [Default Company Ltd]:kafkadev Organizational Unit Name (eg, section) []:CH-kafka Common Name (eg, your name or your server's hostname) []:localhost Email Address []: 

将生成的CA添加到**clients' truststore(客户的信任库)**,以便client可以信任这个CA:

keytool -keystore server.truststore.jks -alias CARoot -import -file ca-cert keytool -keystore client.truststore.jks -alias CARoot -import -file ca-cert

3、签名证书

步骤2生成的CA来签名所有步骤1生成的证书,首先,你需要从密钥仓库导出证书:

keytool -keystore server.keystore.jks -alias localhost -certreq -file cert-file 

然后用CA签名:{validity},{ca-password} 两个为参数,

openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days {validity} -CAcreateserial -passin pass:{ca-password}

最后,你需要导入CA的证书和已签名的证书到密钥仓库:

keytool -keystore server.keystore.jks -alias CARoot -import -file ca-cert keytool -keystore server.keystore.jks -alias localhost -import -file cert-signed

上文中的各参数解释如下:

keystore: 密钥仓库的位置

ca-cert: CA的证书

ca-key: CA的私钥

ca-password: CA的密码

cert-file: 出口,服务器的未签名证书

cert-signed: 已签名的服务器证书

上面步骤所有执行脚本如下:注意密码修改为自己的密码,以防混淆,所有步骤密码最好设为同一个

#!/bin/bash
#Step 1
keytool -keystore server.keystore.jks -alias localhost -validity 3650 -keyalg RSA -genkey
#Step 2
openssl req -new -x509 -keyout ca-key -out ca-cert -days 3650
keytool -keystore server.truststore.jks -alias CARoot -import -file ca-cert
keytool -keystore client.truststore.jks -alias CARoot -import -file ca-cert
#Step 3
keytool -keystore server.keystore.jks -alias localhost -certreq -file cert-file
openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days 3650 -CAcreateserial -passin pass:123456
keytool -keystore server.keystore.jks -alias CARoot -import -file ca-cert
keytool -keystore server.keystore.jks -alias localhost -import -file cert-signed
#Step 4
keytool -keystore client.keystore.jks -alias localhost -validity 3650 -keyalg RSA -genkey

二、配置zookeeper的安全认证

1、在zookeeper的conf文件夹下创建jaas.conf安全配置文件

此文件中定义了两个用户 admin以及kafka 等于号后面是用户对应的密码
此文件定义的是连接zookeeper服务器的用户 JAAS配置节点默认为Server(节点名不可修改,修改后会报错)

Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_admin="!234Qwer"
user_kafka="clearwater001";
};

2、在zookeeper的配置文件zoo.cfg中添加认证配置源文件如下

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/apache-zookeeper-3.5.9-bin/data
dataLogDir=/usr/local/zookeeper/apache-zookeeper-3.5.9-bin/logs
clientPort=2181
#sasl认证
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000

3、在zkEnv.sh启动环境脚本中添加jvm参数,将jaas的配置文件位置作为JVM参数传递给每个客户端的JVM

  LIBPATH=("${ZOOKEEPER_PREFIX}"/share/zookeeper/*.jar)
else
#release tarball format
for i in "$ZOOBINDIR"/../zookeeper-*.jar
do
CLASSPATH="$i:$CLASSPATH"
done
LIBPATH=("${ZOOBINDIR}"/../lib/*.jar)
fi for i in "${LIBPATH[@]}"
do
CLASSPATH="$i:$CLASSPATH"
done #make it work for developers
for d in "$ZOOBINDIR"/../build/lib/*.jar
do
CLASSPATH="$d:$CLASSPATH"
done for d in "$ZOOBINDIR"/../zookeeper-server/target/lib/*.jar
do
CLASSPATH="$d:$CLASSPATH"
done #make it work for developers
CLASSPATH="$ZOOBINDIR/../build/classes:$CLASSPATH" #make it work for developers
CLASSPATH="$ZOOBINDIR/../zookeeper-server/target/classes:$CLASSPATH" case "`uname`" in
CYGWIN*|MINGW*) cygwin=true ;;
*) cygwin=false ;;
esac if $cygwin
then
CLASSPATH=`cygpath -wp "$CLASSPATH"`
fi #echo "CLASSPATH=$CLASSPATH" # default heap for zookeeper server
ZK_SERVER_HEAP="${ZK_SERVER_HEAP:-1000}"
export SERVER_JVMFLAGS="-Xmx${ZK_SERVER_HEAP}m $SERVER_JVMFLAGS"
#JVM参数
export SERVER_JVMFLAGS=" -Djava.security.auth.login.config=/usr/local/zookeeper/apache-zookeeper-3.5.9-bin/conf/jaas.conf" # default heap for zookeeper client
ZK_CLIENT_HEAP="${ZK_CLIENT_HEAP:-256}"
export CLIENT_JVMFLAGS="-Xmx${ZK_CLIENT_HEAP}m $CLIENT_JVMFLAGS"

三、配置kafka的安全认证

1、在kafka的conf目录下创建jaas.conf认证文件

username和password属性 用来定义kafka中各个broker节点之间相互通信的用户
user_用来定义连接到kafka中各个broker的用户 这些用户可供生产者以及消费者进行使用
两个用户的配置均在JAAS默认配置节点KafkaServer中进行配置
broker连接到zookeeper的用户在JAAS默认配置节点Client中进行配置,从上面zookeeper中的jaas文件中选择一个用户进行使用

KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="clearwater"
user_admin="clearwater"
user_kafka="!234Qwer";
};
Client {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="kafka"
password="clearwater001";
};
 

2、在kafka的conf目录下创建kafka_client_jaas.conf认证文件

KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="kafka"
password="!234Qwer";
};

3、在kafka的bin目录下kafka-server-start.sh的启动脚本中配置环境变量,指定jaas.conf文件

if [ $# -lt 1 ];
then
echo "USAGE: $0 [-daemon] server.properties [--override property=value]*"
exit 1
fi
base_dir=$(dirname $0) if [ "x$KAFKA_LOG4J_OPTS" = "x" ]; then
export KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:$base_dir/../config/log4j.properties"
fi
#环境变量
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G -Djava.security.auth.login.config=/usr/local/kafka_2.12-2.8.0/config/jaas.conf"
fi EXTRA_ARGS=${EXTRA_ARGS-'-name kafkaServer -loggc'} COMMAND=$1
case $COMMAND in
-daemon)
EXTRA_ARGS="-daemon "$EXTRA_ARGS
shift
;;
*)
;;
esac exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"

4、在kafka的bin目录下kafka-console-producer.sh的启动脚本中配置环境变量,指定jaas.conf文件

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx512M -Djava.security.auth.login.config=/usr/local/kafka_2.12-2.8.0/config/kafka_client_jaas.conf"
fi
exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"

5、在kafka的bin目录下kafka-server-start.sh的启动脚本中配置环境变量,指定jaas.conf文件

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx512M -Djava.security.auth.login.config=/usr/local/kafka_2.12-2.8.0/config/kafka_client_jaas.conf"
fi exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleConsumer "$@"

6、在kafka的bin目录下创建client-ssl.properties认证文件(执行生产者和消费者命令时指定)

security.protocol=SASL_SSL
ssl.endpoint.identification.algorithm=
sasl.mechanism=PLAIN
group.id=test
ssl.truststore.location=/usr/local/kafka_2.12-2.8.0/ssl/client.truststore.jks
ssl.truststore.password=clearwater001!

7、配置kafka的server.properties配置文件,添加如下内容

#sasl_ssl
listeners=SASL_SSL://172.17.0.53:9093
advertised.listeners=SASL_SSL://172.17.0.53:9093
security.inter.broker.protocol=SASL_SSL
sasl.enabled.mechanisms=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
allow.everyone.if.no.acl.found=true
ssl.keystore.location=/usr/local/kafka_2.12-2.8.0/ssl/server.keystore.jks
ssl.keystore.password=clearwater001!
ssl.key.password=clearwater001!
ssl.truststore.location=/usr/local/kafka_2.12-2.8.0/ssl/server.truststore.jks
ssl.truststore.password=clearwater001!
ssl.endpoint.identification.algorithm=

8、重启zookeeper和kafka,创建topic(命令在第四节),添加生产者和消费者授权

#生产者授权
./kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:"kafka" --producer --topic "test"
#消费者授权
./kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:"kafka" --consumer --topic "test" --group '*'

四、相关启动命令

1、启动zookeeper

/usr/local/zookeeper/apache-zookeeper-3.5.9-bin/bin/zkServer.sh start

2、启动kafka-server

./kafka-server-start.sh  -daemon /usr/local/kafka_2.12-2.8.0/config/server.properties

3、创建topic

./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
#查看topic list
./kafka-topics.sh --list --zookeeper localhost:2181

4、加密前生产消费消息(一般使用新版本命令)

###生产消息###
#老版本
./kafka-console-producer.sh --broker-list localhost:9092 --topic test
#新版本
./kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test ###消费消息###
#老版本
./kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
#新版本
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

5、加密后生产消费消息命令

#生产消息
./kafka-console-producer.sh --bootstrap-server 172.17.0.53:9093 --topic test --producer.config client-ssl.properties
#消费消息
./kafka-console-consumer.sh --bootstrap-server 172.17.0.53:9093 --topic test --from-beginning --consumer.config client-ssl.properties

Kafka配置SASL_SSL认证传输加密的更多相关文章

  1. snmp v3的安全配置 snmp认证与加密配置(53)

    http://www.ttlsa.com/zabbix/snmp-v3-configuration/

  2. 自学Zabbix11.4 Zabbix SNMP认证与加密配置 SNMPv3

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix11.4 Zabbix SNMP认证与加密配置 SNMPv3 1. 增加snmp ...

  3. Nginx 配置 Basic 认证

    /* * 环境:LNMP(CentOS 6.6 + Nginx 1.8.0) */ 在 Nginx 下配置 Basic 认证需要依靠 Nginx 的 http_auth_basic_module 模块 ...

  4. SNMP学习笔记之SNMPv3的报文格式以及基于USM的认证和加密过程

    下面我们就主要讲解SNMPv3的报文格式以及基于USM的认证和加密过程! 1.SNMPv3的消息格式 如下图1: 图 1 其中,整个SNMPv3消息可以使用认证机制,并对EngineID.Contex ...

  5. SNMP学习笔记之SNMPv3的配置和认证以及TroubleShooting

    0x00 增加snmp v3用户 增加用户的时候,必须要停止SNMP服务. # service snmpd stop # net-snmp-config --create-snmpv3-user -r ...

  6. hadoop生态搭建(3节点)-08.kafka配置

    如果之前没有安装jdk和zookeeper,安装了的请直接跳过 # https://www.oracle.com/technetwork/java/javase/downloads/java-arch ...

  7. 使用rsa进行http传输加密

    目录 1. RSA算法 2. HTTPS 2.1 HTTPS优点 2.2 HTTPS缺点 3. RSA传输加密实现 3.1 所需插件 3.1.1 JS插件 3.1.2 所需JAR 3.1.3 代码 4 ...

  8. 十八.搭建Nginx服务器、配置网页认证、基于域名的虚拟主机、ssl虚拟主机

    配置要求: client:192.168.4.10 proxy:192.168.4.5(eth0) 192.168.2.5(eth1) web1:192.168.2.100 web2:192.168. ...

  9. Kafka Kerberos 安全认证

    本主要介绍在 Kafka 中如何配置 Kerberos 认证,文中所使用到的软件版本:Java 1.8.0_261.Kafka_2.12-2.6.0.Kerberos 1.15.1. 1. Kerbe ...

  10. Harbor配置https认证

    Harbor配置https认证由于Harbor不附带任何证书,它默认使用HTTP来提供注册表请求.但是,强烈建议为任何生产环境启用安全性.因为测试使用,使用自签名证书: 1.创建CA证书 首先创建个目 ...

随机推荐

  1. bge-large-zh-v1.5 和 bge-reranker-large模型有什么区别和联系

    BGE(BAAI General Embedding)系列模型是智源研究院开发的高性能语义表征工具,其中bge-large-zh-v1.5和bge-reranker-large是两类不同功能的模型.它 ...

  2. C# yyyyMMddHHmmss格式转换DateTime

    https://blog.csdn.net/lilinoscar/article/details/75529821 例如14位日期:20170417101215 转换DateTime格式:    va ...

  3. java--servelt编程

    Servlet的映射路径 <servlet-mapping> <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! --> <servlet-name& ...

  4. 用AI重塑游戏体验:《诛仙2》携手HarmonyOS SDK实现性能与功耗双赢

    作为由完美世界开发的国风MMORPG,<诛仙2>构建的宏大的游戏世界,不仅拥有陆地.海洋与北境等多种地貌组成的6km*6km超大无缝地图,还加入了独特的角色光照及渲染系统,其极致写实的画面 ...

  5. vite vue/react使用pont-engine

    pont-engine 是一款阿里的api生成工具! 安装依赖即可 yarn add --dev pont-engine 然后即可使用 pont start 生成之后,在入口文件导入生成的index即 ...

  6. create-react-app利用craco配置路径别名、Less

    写的挺好,直接搬过来了,验证过,不是无脑搬运原文 &  参考 1.安装 craco/craco $ yarn add @craco/craco # OR $ npm install @crac ...

  7. ?? js 语法糖

    leetcode 2619 遇到了 ?? 语法糖,简而言之 可选链功能 就是防止抛出异常 caught TypeError: Cannot read properties of undefined ( ...

  8. sublime3 教程 比较好的

    因为不让转载 所以列出 地址http://www.cnblogs.com/figure9/p/sublime-text-complete-guide.html 关键技术要点: Ctrl + ←/→进行 ...

  9. 如何使用ETLCloud拉通金蝶云

    一.ETLCloud集成组件 ETLCloud采用了一种创新的基于平台底座的理念.它通过将组件和平台进行分离,用户可以在平台上自行下载和安装所需的组件,而无需升级整个底座版本.这样用户就可以通过不断升 ...

  10. Advanced Algebra高等代数 - 多元建模有多个方程(多元线性)组成 - 使用 NumPy 实现 矩阵的初等行变换:

    线性:指多元变量的每一元变量都是1次方(可以将高于1次方的元,以新一元变量代换,求解再做开方运算) 将应用问题转化为 多个多元线性方程,并成一组: 由多元线性方程组 抽出 增广矩阵,并以"消 ...