第一步:创建数据目录
sudo mkdir -p /app/kafka/certs
sudo mkdir -p /app/kafka/data
sudo chmod -R 777 /app/kafka
第二步:生成服务端证书
-
创建 CA(根证书):
Bash
cd /app/kafka/certs openssl req -new -x509 -nodes -days 3650 \ -subj "/CN=localhost" \ -keyout server.key -out server.crt cat server.key server.crt > server.pem
Spring Boot 客户端配置
在你的本地开发项目中,修改 application.yml。由于我们使用的是自签名证书,需要关闭域名校验。
YAML
spring:
kafka:
bootstrap-servers: <你的公网IP>:9094
properties:
security.protocol: SSL
ssl.truststore.type: PEM
# 注意:如果是在本地 Windows 开发,这里可以写文件绝对路径
ssl.truststore.location: src/main/resources/kafka/server.crt
# 必须加上这一行,否则自签名证书会因为域名不匹配报错
ssl.endpoint.identification.algorithm: ""
第三步:准备 Docker 挂载目录
将生成的 kafka.server.keystore.jks 和 kafka.server.truststore.jks 放到服务器的一个目录下,例如 /opt/kafka/certs。
第四步:修改 Docker Run 命令
在双监听器基础上,加入 SSL 相关的配置项。注意 EXTERNAL 监听器的协议要改为 SSL。
docker run -d \
--name kafka-server \
--restart always \
-p 9092:9092 \
-p 9094:9094 \
-v /app/kafka/certs:/opt/kafka/config/certs \
-v /app/kafka/data:/var/lib/kafka/data \
-e KAFKA_NODE_ID=0 \
-e KAFKA_PROCESS_ROLES=broker,controller \
-e KAFKA_CONTROLLER_QUORUM_VOTERS=0@localhost:9093 \
-e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
-e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,EXTERNAL:SSL,CONTROLLER:PLAINTEXT \
-e KAFKA_LISTENERS=INTERNAL://0.0.0.0:9092,EXTERNAL://0.0.0.0:9094,CONTROLLER://0.0.0.0:9093 \
-e KAFKA_ADVERTISED_LISTENERS=INTERNAL://<内网IP>:9092,EXTERNAL://<外网IP>:9094 \
-e KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL \
-e KAFKA_SSL_KEYSTORE_TYPE=PEM \
-e KAFKA_SSL_KEYSTORE_LOCATION=/opt/kafka/config/certs/server.pem \
-e KAFKA_SSL_TRUSTSTORE_TYPE=PEM \
-e KAFKA_SSL_TRUSTSTORE_LOCATION=/opt/kafka/config/certs/server.crt \
-e KAFKA_SSL_CLIENT_AUTH=none \
-e KAFKA_LOG_RETENTION_MS=86400000 \
-e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
--log-opt max-size=1g \
--log-opt max-file=2 \
apache/kafka:3.8.1