Kafka配置SSL(雲環境)


本文結合一個具體的實例給出如何在公有雲環境上配置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件事即可:

  1. 運行setup_ssl_for_servers.sh腳本(本例使用這個名字)
  2. 配置broker的server.properties
  3. 配置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 1 Created 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, world hello, Kafka a test message

可見,Mac筆記本上的clients都可以正常工作了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM