kafka3.7配置SSL证书及公网域名代理
一、安装JDK及zookeeper
略,可以参考此文档安装JDK和zookeeper步骤:https://www.cnblogs.com/panwenbin-logs/p/18867769
二、创建kafka服务端及客户端相关证书
1.生成服务端证书
mkdir ssl && cd ssl
1.生成CA证书
#创建CA证书并设置私钥密码为 CABzUnTyCOwOscFU,其中需要注意的是 CN=kafka.test.com 的值为网站的域名,本次实验的域名为kafka.test.com,所以值可以为kafka.test.com或者test.com
openssl req -new -x509 -keyout ca-key -out ca-cert -days 36500 -passout pass:CABzUnTyCOwOscFU -subj "/C=cn/ST=beijing/L=beijing/O=test/OU=test/CN=kafka.test.com"
2.生成服务端密钥对
#创建密钥库文件名为 server.keystore.jks,如果该文件已存在则表示操作该文件,主要命令中 "CN= SAN=DNS:的值必须为本次的测试域名,可以写多个用逗号分隔,也可以是IP,如-ext "SAN=DNS:kafka.test.com,IP:192.168.1.1"
# -storepass 设置密钥库server.keystore.jks的访问密码,-keypass 设置私钥的密码,建议与-storepass保持一致
keytool -keystore server.keystore.jks -alias kafka-server -validity 36500 -genkey \
-keyalg RSA -dname "CN=kafka.test.com,OU=test,O=test,L=beijing,S=beijing,C=cn" \
-ext "SAN=DNS:kafka.test.com" -storepass CABzUnTyCOwOscFU -keypass CABzUnTyCOwOscFU
3.生成CSR并签名
#-keystore server.keystore.jks 从名为 server.keystore.jks 的密钥库中读取密钥对
#-file server.csr 将生成的 CSR 保存到文件 server.csr
keytool -keystore server.keystore.jks -alias kafka-server -certreq -file server.csr -storepass CABzUnTyCOwOscFU
# OpenSSL 签名 CSR 时,默认不会自动包含原始 CSR 中的 SAN 扩展,所以需要写入到文件中,在OpenSSL签署时强制写入SAN信息 -extfile参数指定
#签署 server.csr请求文件输出到server.crt(已签名证书)
#-passin pass:CABzUnTyCOwOscFU 指定证书私钥密码
echo "subjectAltName=DNS:kafka.test.com" > san.ext
openssl x509 -req -CA ca-cert -CAkey ca-key -in server.csr -out server.crt -days 36500 -CAcreateserial -passin pass:CABzUnTyCOwOscFU -extfile san.ext
4.导入CA和签名证书
##将受信任的 CA 证书添加到server.keystore.jks密钥库,使 Java 应用信任该 CA 签发的所有证书。 -noprompt 非交互式
keytool -keystore server.keystore.jks -alias CARoot -import -file ca-cert -storepass CABzUnTyCOwOscFU -noprompt
#将文件 server.crt(Kafka 服务器的签名证书)导入到密钥库 server.keystore.jks 中,并设置别名为 kafka-server
keytool -keystore server.keystore.jks -alias kafka-server -import -file server.crt -storepass CABzUnTyCOwOscFU -noprompt
2.生成客户端证书
1.生成客户端密钥对
#此处CN和SAN的值的作用仅为标识客户端信息,不影响客户端访问的结果
keytool -keystore client.keystore.jks -alias kafka-client -validity 36500 -genkey \
-keyalg RSA -dname "CN=test1-kafka-client,OU=test,O=test,L=beijing,S=beijing,C=cn" \
-ext "SAN=DNS:test1-kafka-client" -storepass CABzUnTyCOwOscFU -keypass CABzUnTyCOwOscFU
2.生成客户端请求文件
keytool -keystore client.keystore.jks -alias kafka-client -certreq -file client.csr -storepass CABzUnTyCOwOscFU
3.签名客户端证书
openssl x509 -req -CA ca-cert -CAkey ca-key -in client.csr -out client.crt -days 36500 -CAcreateserial -passin pass:CABzUnTyCOwOscFU
4.导入CA和签名证书
keytool -keystore client.keystore.jks -alias CARoot -import -file ca-cert -storepass CABzUnTyCOwOscFU -noprompt
keytool -keystore client.keystore.jks -alias kafka-client -import -file client.crt -storepass CABzUnTyCOwOscFU -noprompt
3.信任库配置
#将 CA 证书(ca-cert)分别导入到两个不同的信任库(truststore)中
keytool -keystore server.truststore.jks -alias CARoot -import -file ca-cert -storepass CABzUnTyCOwOscFU -noprompt
keytool -keystore client.truststore.jks -alias CARoot -import -file ca-cert -storepass CABzUnTyCOwOscFU -noprompt
4.验证证书
echo '192.168.200.131 kafka.test.com' >> /etc/hosts #确保域名可以被解析,如果kafka配置中使用了域名,则域名需指向本机地址
openssl x509 -in server.crt -text -noout| grep -A 1 "Subject Alternative Name" #检查证书SAN内容
openssl x509 -in server.crt -text -noout | grep 'Subject:' #检查证书CN内容
keytool -list -v -keystore server.keystore.jks -storepass CABzUnTyCOwOscFU # 查看指定密钥库(Keystore)的详细内容,包括证书、私钥和信任链信息。
openssl s_client -debug -connect kafka.test.com:9093 -tls1_2 #查看SSL握手信息
#查看详细SSL握手信息
#将JKS格式的私钥导出为PKCS12格式的私钥
keytool -importkeystore -srckeystore client.keystore.jks -destkeystore client.p12 -deststoretype PKCS12 -srcstorepass CABzUnTyCOwOscFU -deststorepass CABzUnTyCOwOscFU
openssl pkcs12 -in client.p12 -nocerts -nodes -passin pass:CABzUnTyCOwOscFU #通过OpenSSL查看私钥内容
openssl s_client -connect kafka.test.com:9093 \
-servername kafka.test.com:9093 \
-cert client.crt \
-key <(openssl pkcs12 -in client.p12 -nocerts -nodes -passin pass:CABzUnTyCOwOscFU) \
-CAfile ca-cert \
-tls1_2 -state -debug
三、配置kafka
tar xf kafka_2.13-3.7.0.tgz -C /usr/local
cd /usr/local
ln -sv kafka_2.13-3.7.0 kafka
cd kafka
cp -r /root/ssl .
cd config/
cp server.properties server.properties-bak
vim server.properties
broker.id=0
log.dirs=/Data/kafka
num.partitions=1
# 网络配置
listeners=INTERNAL://0.0.0.0:9092,EXTERNAL://kafka.test.com:9093 # Kafka Broker 绑定并监听的地址和端口,如果是域名则必须可以被解析,这里kafka.test.com也可以写成IP地址,适用场景:Broker 间同步、内网微服务调用
advertised.listeners=INTERNAL://192.168.200.131:9092,EXTERNAL://kafka.test.com:9093 # Kafka Broker对外发布的地址,值必须为域名或指定的IP不能为0.0.0.0,如果是域名则必须可以被解析,适用场景:公网客户端、跨网络访问
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:SSL #这里指定INTERNAL监听器通信使用明文,EXTERNAL监听器通信使用SSL加密
inter.broker.listener.name=INTERNAL #内部通信使用明文,与下面security.inter.broker.protocol选项互斥
#security.inter.broker.protocol=SSL #内部通信使用加密协议,与inter.broker.listener.name选项互斥
ssl.keystore.location=/usr/local/kafka/ssl/server.keystore.jks
ssl.keystore.password=CABzUnTyCOwOscFU
ssl.key.password=CABzUnTyCOwOscFU
ssl.truststore.location=/usr/local/kafka/ssl/server.truststore.jks
ssl.truststore.password=CABzUnTyCOwOscFU
#这一行官方文档没有,加上,否则可能报错
ssl.endpoint.identification.algorithm=HTTPS #启用主机名验证,强制Kafka Broker和客户端在SSL/TLS握手时,验证服务器证书中的SAN或CN是否与连接的主机名(如 本次实验域名kafka.test.com)匹配, 如果值为空或为none则表示禁用主机名验证
ssl.client.auth=required #配置服务端、客户端双向认证
# 性能配置
num.network.threads=5
num.io.threads=16
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600
num.recovery.threads.per.data.dir=4
# 日志配置
log.segment.bytes=1073741824
log.retention.hours=168
# 增加到10GB
log.retention.bytes=10737418240
log.retention.check.interval.ms=300000
log.flush.interval.messages=50000
log.flush.interval.ms=5000
# 副本配置(单节点可保持1,集群需修改)
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
default.replication.factor=1
# Zookeeper配置
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=18000
zookeeper.session.timeout.ms=18000
# 其他
group.initial.rebalance.delay.ms=0
四、启动及验证kafka
1.启动服务
mkdir -pv /Data/kafka
cd /usr/local/kafka/bin/
./kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
netstat -tnlp
2.内部监听端口验证
./kafka-topics.sh --bootstrap-server 192.168.200.131:9092 --list #不报错,返回为空为正常
3.外部SSL监听端口验证
创建客户端证书
vim client-ssl.properties #如果其他客户端需要访问记得拷贝证书
bootstrap.servers=kafka.test.com:9093
security.protocol=SSL
ssl.keystore.location=/usr/local/kafka/ssl/client.keystore.jks
ssl.keystore.password=CABzUnTyCOwOscFU
ssl.truststore.location=/usr/local/kafka/ssl/client.truststore.jks
ssl.truststore.password=CABzUnTyCOwOscFU
./kafka-topics.sh --bootstrap-server kafka.test.com:9093 --list --command-config client-ssl.properties
./kafka-topics.sh --bootstrap-server kafka.test.com:9093 --create --topic test-topic-ssl --command-config client-ssl.properties #创建一个topic
./kafka-topics.sh --bootstrap-server kafka.test.com:9093 --list --command-config client-ssl.properties #创建一个生产者,并发送测试内容
./kafka-console-consumer.sh --bootstrap-server kafka.test.com:9093 --topic test-topic-ssl --from-beginning --consumer.config client-ssl.properties #在其他客户端启动一个消费者,查看是否可以接受到数据
"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少

浙公网安备 33010602011771号