Kafka配置SSL(云环境)
来源:互联网 发布:担保公司业务软件 编辑:程序博客网 时间:2024/06/05 03:36
本文结合一个具体的实例给出如何在公有云环境上配置Kafka broker与client之间的SSL设置。
测试环境
- 阿里云机一台(Server端):主机名是kafka1,负责运行单节点的Kafka集群。本文选择0.11.0.0版本
- Mac笔记本一台(Client端):通过公网连接阿里云机器上的Kafka服务,给Kafka集群发送消息以及消费消息
前期准备
- 在kafka1上,配置kafka1与内网IP的映射关系(修改/etc/hosts),即ping kafka1返回内网IP地址
- 在Mac笔记本上,配置kafka1指向阿里云机器的外网IP
- 分别下载Kafka 0.11.0.0二进制包到kafka1和笔记本上
创建配置脚本
配置SSL的步骤有很多,大致流程如下:
本例会创建一个方便的SHELL脚本,自动地执行前7步的工作。这样用户实际上只需要做3件事即可:
- 运行setup_ssl_for_servers.sh脚本(本例使用这个名字)
- 配置broker的server.properties
- 配置clients的特定属性
下面我们来看下setup_ssl_for_servers.sh脚本的实际内容,首先来看第一部分:
0. 设置环境变量
#!/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_PATH
1. 创建keystore
echo "1. 创建集群证书到keystore......"keytool -keystore $KEY_STORE -alias $CLUSTER_NAME -validity $DAYS_VALID -genkey -keyalg RSA \-storepass $STORE_PASSWORD -keypass $KEY_PASSWORD -dname "$DNAME"
2. 创建CA
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"
3. 导入CA到truststore
echo "3. 导入CA文件到truststore......"keytool -keystore "$TRUST_STORE" -alias CARoot \-import -file "$CERT_AUTH_FILE" -storepass "$TRUST_STORE_PASSWORD" -keypass "$TRUST_KEY_PASS" -noprompt
4. 从keystore中导出证书
echo "4. 从key store中导出集群证书......"keytool -keystore "$KEY_STORE" -alias "$CLUSTER_NAME" -certreq -file "$CLUSTER_CERT_FILE" -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt
5. 签发证书
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"
6. 导入CA到keystore
echo "6. 导入CA文件到keystore......"keytool -keystore "$KEY_STORE" -alias CARoot -import -file "$CERT_AUTH_FILE" -storepass "$STORE_PASSWORD" \ -keypass "$KEY_PASSWORD" -noprompt
7. 导入证书到keystore
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.sh
下面,我们在Kafka broker机器上运行setup_ssl_for_servers.sh脚本,结果输出如下:
如上图可见,setup_ssl_for_servers.sh脚本执行成功了,现在去到对应的目录下去检查生成的文件列表:
- ca-cert:CA文件,不要把该文件拷贝到别的broker机器上!
- test-cluster-cert-signed:CA已签发的Kafka证书文件,不要把该文件拷贝到别的broker机器上!
- test-cluster-cert:Kafka认证文件(包含公钥和私钥),不要把该文件拷贝到别的broker机器上!
- kafka.keystore:Kafka的keystore文件,用户需要将该文件拷贝到所有clients端和broker机器上!
- kafka.truststore:Kafka的truststore文件,用户需要将该文件拷贝到所有clients端和broker机器上!
配置Broker端参数
由于本例中client只有一个,即Mac笔记本,故我们需要把kafka.keystore和kafka.truststore拷贝到Mac笔记本上的某个位置,假设是/Users/huxi/Downloads/下。那么现在我们就可以开始配置broker端的server.properties文件了,与SSL相关的部分如下:
- listeners=PLAINTEXT://:9092,SSL://:9093 # 这里为Kafka broker配置了两个listeners,一个是明文传输;另一个使用SSL加密进行数据传输
- advertised.listeners=PLAINTEXT://公网IP:9092,SSL://公网IP:9093 # 因为是云上环境,如果clients通过公网(或外网)去连接broker,那么advertiesd.listeners就必须配置成所在机器的公网IP
- ssl.keystore.location=/mnt/disk/huxitest/certificates/kafka.keystore # 提供SSL keystore的文件
- ssl.keystore.password=kafka1234567 # 提供keystore密码
- ssl.truststore.location=/mnt/disk/huxitest/certificates/kafka.truststore # 提供SSL truststore的文件
- ssl.truststore.password=kafka1234567 # 提供truststore密码
- ssl.key.password=kafka1234567 # keystore中的私钥密码
- ssl.client.auth=required # 设置clients也要开启认证
配置好这些参数之后启动Kafka broker:
然后创建测试topic,如下所示:
$ bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic test --partitions 1 --replication-factor 1Created topic "test".
配置clients端参数
本例中我们使用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, worldhello, Kafkaa test message
可见,Mac笔记本上的clients都可以正常工作了。
- Kafka配置SSL(云环境)
- Kafka Security 配置SSL
- Kafka SSL 和 ACL 配置
- 5.配置kafka环境
- kafka SSL证书生成及配置
- kafka+zookeeper环境配置
- Windows单机配置Kafka环境
- Windows单机配置Kafka环境
- Windows单机配置Kafka环境
- Windows环境Tomcat配置SSL
- Open SSL 开发环境配置
- flume kafka测试环境配置 windows
- Tomcat配置SSL(Windows环境)
- java环境中配置SSL双向认证
- Ubuntu系统下配置APACHE/SSL环境
- XE7下SSL运行环境配置
- Nginx环境ssl配置+手动生成证书
- kafka+zookeeper环境配置(Mac 或者 linux环境)
- Apache Ant一个基于Java的生成工具
- ALV复制内容到剪贴板
- Robinson Compass Masks
- 使用xshell-ssh连接服务器被经常意外中断(Disconnected from remote host)
- 开发一个基于ZXing库以及安卓Studio的二维码扫描小程序(二)
- Kafka配置SSL(云环境)
- 临时解决 cat 打开中文乱码
- CSDN--Markdown语法
- Django分析之使用redis缓存服务器
- 【编程题】2018阿里编程题题一
- 编译安装vim8.0
- Linux开发工具(gcc gdb make shell)——GCC中-I -L -l区别
- Visual Assist实现*.h和*.cpp的函数声明和定义的同步。
- Leetcode#35: Search Insert Position