生成SSL證書文件腳本
#!/bin/bash
################################## 設置環境變量 ##############################
BASE_DIR=/mnt/disk/test # 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=ChengDu, OU=YourDept, O=YourCompany, L=Beijing, ST=Beijing, C=CN" # distinguished name
##############################################################################mkdir -p $CERT_OUTPUT_PATHecho "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" -nopromptecho "4. 從key store中導出集群證書......"
keytool -keystore "$KEY_STORE" -alias "$CLUSTER_NAME" -certreq -file "$CLUSTER_CERT_FILE" -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -nopromptecho "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" -nopromptecho "7. 導入已簽發證書到keystore......"
keytool -keystore "$KEY_STORE" -alias "${CLUSTER_NAME}" -import -file "${CLUSTER_CERT_FILE}-signed" \-storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt
生成的文件說明:?
- 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端參數
? 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/test/certificates/kafka.keystore # 提供SSL keystore的文件
? ssl.keystore.password=kafka1234567 # 提供keystore密碼
? ssl.truststore.location=/mnt/disk/test/certificates/kafka.truststore # 提供SSL truststore的文件
? ssl.truststore.password=kafka1234567 # 提供truststore密碼
? ssl.key.password=kafka1234567 # keystore中的私鑰密碼
? ssl.client.auth=required # 設置clients也要開啟認證
啟動服務并測試創建topic
$ bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic test --partitions 1 --replication-factor 1
Created topic "test".
配置clients端參數
1. 配置producer.config
bootstrap.servers=kafka1:9093 # 指定9093端口,即使用SSL監聽器端口
security.protocol=SSL
ssl.truststore.location=/Users/xxx/Downloads/kafka.truststore # 指定truststore文件
ssl.truststore.password=kafka1234567
ssl.keystore.password=kafka1234567
ssl.keystore.location=/Users/xxx/Downloads/kafka.keystore # 指定keystore文件
2. 測試生產消息
$ bin/kafka-console-producer.sh --broker-list kafka1:9093 --topic test --producer.config producer.config
>hello, world
>hello, Kafka
>a test message
......
3. 配置consumer.config
security.protocol=SSL
group.id=test-group
ssl.truststore.location=/Users/xxx/Downloads/kafka.truststore # 指定truststore文件
ssl.truststore.password=kafka1234567
ssl.keystore.password=kafka1234567
ssl.keystore.location=/Users/xxx/Downloads/kafka.keystore # 指定keystore文件
4. 測試消費消息
$ bin/kafka-console-consumer.sh --bootstrap-server kafka1:9093 --topic test --from-beginning --consumer.config consumer.config
hello, world
hello, Kafka
a test message