本文结合一个具体的实例给出如何在公有云环境上配置Kafka broker与client之间的SSL设置。bootstrap
配置SSL的步骤有不少,大体流程以下:bash
本例会建立一个方便的SHELL脚本,自动地执行前7步的工做。这样用户实际上只须要作3件事便可:测试
下面咱们来看下setup_ssl_for_servers.sh脚本的实际内容,首先来看第一部分:ui
#!/bin/bash阿里云
################################## 设置环境变量 ##############################
BASE_DIR=/mnt/disk/huxitest # SSL各类生成文件的基础路径
CERT_OUTPUT_PATH="$BASE_DIR/certificates" # 证书文件生成路径
PASSWORD=kafka1234567 # 密码
KEY_STORE="$CERT_OUTPUT_PATH/kafka.keystore" # Kafka keystore文件路径
TRUST_STORE="$CERT_OUTPUT_PATH/kafka.truststore" # Kafka truststore文件路径
KEY_PASSWORD=$PASSWORD # keystore的key密码
STORE_PASSWORD=$PASSWORD # keystore的store密码
TRUST_KEY_PASSWORD=$PASSWORD # truststore的key密码
TRUST_STORE_PASSWORD=$PASSWORD # truststore的store密码
CLUSTER_NAME=test-cluster # 指定别名
CERT_AUTH_FILE="$CERT_OUTPUT_PATH/ca-cert" # CA证书文件路径
CLUSTER_CERT_FILE="$CERT_OUTPUT_PATH/${CLUSTER_NAME}-cert" # 集群证书文件路径
DAYS_VALID=365 # key有效期
D_NAME="CN=Xi Hu, OU=YourDept, O=YourCompany, L=Beijing, ST=Beijing, C=CN" # distinguished name
##############################################################################加密
mkdir -p $CERT_OUTPUT_PATHspa
echo "1. 建立集群证书到keystore......" keytool -keystore $KEY_STORE -alias $CLUSTER_NAME -validity $DAYS_VALID -genkey -keyalg RSA \ -storepass $STORE_PASSWORD -keypass $KEY_PASSWORD -dname "$DNAME"
echo "2. 建立CA......" openssl req -new -x509 -keyout $CERT_OUTPUT_PATH/ca-key -out "$CERT_AUTH_FILE" -days "$DAYS_VALID" \ -passin pass:"$PASSWORD" -passout pass:"$PASSWORD" \ -subj "/C=CN/ST=Beijing/L=Beijing/O=YourCompany/CN=Xi Hu"
echo "3. 导入CA文件到truststore......" keytool -keystore "$TRUST_STORE" -alias CARoot \ -import -file "$CERT_AUTH_FILE" -storepass "$TRUST_STORE_PASSWORD" -keypass "$TRUST_KEY_PASS" -noprompt
echo "4. 从key store中导出集群证书......" keytool -keystore "$KEY_STORE" -alias "$CLUSTER_NAME" -certreq -file "$CLUSTER_CERT_FILE" -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt
echo "5. 签发证书......" openssl x509 -req -CA "$CERT_AUTH_FILE" -CAkey $CERT_OUTPUT_PATH/ca-key -in "$CLUSTER_CERT_FILE" \ -out "${CLUSTER_CERT_FILE}-signed" \ -days "$DAYS_VALID" -CAcreateserial -passin pass:"$PASSWORD"
echo "6. 导入CA文件到keystore......" keytool -keystore "$KEY_STORE" -alias CARoot -import -file "$CERT_AUTH_FILE" -storepass "$STORE_PASSWORD" \ -keypass "$KEY_PASSWORD" -noprompt
echo "7. 导入已签发证书到keystore......" keytool -keystore "$KEY_STORE" -alias "${CLUSTER_NAME}" -import -file "${CLUSTER_CERT_FILE}-signed" \ -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt
完整脚本以下:setup_ssl_for_servers.shcode
下面,咱们在Kafka broker机器上运行setup_ssl_for_servers.sh脚本,结果输出以下:server
如上图可见,setup_ssl_for_servers.sh脚本执行成功了,如今去到对应的目录下去检查生成的文件列表:blog
因为本例中client只有一个,即Mac笔记本,故咱们须要把kafka.keystore和kafka.truststore拷贝到Mac笔记本上的某个位置,假设是/Users/huxi/Downloads/下。那么如今咱们就能够开始配置broker端的server.properties文件了,与SSL相关的部分以下:
配置好这些参数以后启动Kafka broker:
而后建立测试topic,以下所示:
$ bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic test --partitions 1 --replication-factor 1 Created topic "test".
本例中咱们使用console-producer和console-consumer脚原本从Mac笔记本上给位于阿里云机器上的broker收发消息 ,下面首先演示如何配置producer。首先,咱们建立一个producer.config文件,里面的内容以下:
bootstrap.servers=kafka1:9093 # 指定9093端口,即便用SSL监听器端口
security.protocol=SSL
ssl.truststore.location=/Users/huxi/Downloads/kafka.truststore # 指定truststore文件
ssl.truststore.password=kafka1234567
ssl.keystore.password=kafka1234567
ssl.keystore.location=/Users/huxi/Downloads/kafka.keystore # 指定keystore文件
保存以后,咱们运行console-producer来生产消息:
$ bin/kafka-console-producer.sh --broker-list kafka1:9093 --topic test --producer.config producer.config >hello, world >hello, Kafka >a test message ......
一样地,咱们建立一个consumer.config文件,内容以下:
security.protocol=SSL
group.id=test-group
ssl.truststore.location=/Users/huxi/Downloads/kafka.truststore # 指定truststore文件
ssl.truststore.password=kafka1234567
ssl.keystore.password=kafka1234567
ssl.keystore.location=/Users/huxi/Downloads/kafka.keystore # 指定keystore文件
保存以后,咱们运行console-consumer来消费消息:
$ bin/kafka-console-consumer.sh --bootstrap-server kafka1:9093 --topic test --from-beginning --consumer.config consumer.config hello, world hello, Kafka a test message
可见,Mac笔记本上的clients均可以正常工做了。