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 #在其他客户端启动一个消费者,查看是否可以接受到数据

 

posted @ 2025-05-19 16:36  百衲本  阅读(169)  评论(0)    收藏  举报
cnblogs_post_body { color: black; font: 0.875em/1.5em "微软雅黑" , "PTSans" , "Arial" ,sans-serif; font-size: 15px; } cnblogs_post_body h1 { text-align:center; background: #333366; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 23px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h2 { text-align:center; background: #006699; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 20px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h3 { background: #2B6695; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 18px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } 回到顶部 博客侧边栏 回到顶部 页首代码 回到顶部 页脚代码