docker部署kafka简单的ssl认证
时间: 2025-07-24 16:32:46 浏览: 17
<think>我们已经在之前的回答中详细说明了如何在Docker中部署Kafka并配置SSL认证。但是,根据用户的问题,他们希望参考站内引用,并且可能希望得到一个更简洁的步骤。同时,用户提供的引用内容中包含了SASL_SSL的配置和持久化等内容,但用户明确要求的是“简单的SSL认证”,所以我们应专注于SSL单向认证。
根据之前的回答,我们可以总结为以下步骤:
1. 生成SSL证书(包括CA证书、服务端证书和truststore)
2. 创建docker-compose.yml文件,配置Kafka容器使用SSL
3. 启动服务
4. 测试连接
但注意:用户引用[1]中提到了Spring Boot的配置,引用[2]提到了持久化,引用[3]提到了SASL认证。由于用户明确要求“简单的SSL认证”,我们不需要引入SASL,只需SSL单向认证即可。
因此,我们重新整理一个更清晰的步骤,并注意以下几点:
- 使用bitnami/kafka镜像,因为它配置SSL相对简单。
- 只配置SSL,不配置SASL。
- 使用单向认证(客户端验证服务器,但服务器不验证客户端)。
具体步骤:
### 1. 生成SSL证书
```bash
# 创建证书目录
mkdir -p kafka-certs && cd kafka-certs
# 生成CA私钥和自签名证书
openssl req -new -x509 -keyout ca.key -out ca.crt -days 365 -passout pass:kafka2024 -subj "/CN=Kafka CA"
# 生成服务端密钥库(keystore)并生成证书请求
keytool -keystore kafka.keystore.jks -alias kafka -validity 365 -genkey -keyalg RSA \
-storepass kafka2024 -keypass kafka2024 -dname "CN=kafka"
# 从keystore中导出证书请求
keytool -keystore kafka.keystore.jks -alias kafka -certreq -file kafka.csr -storepass kafka2024
# 使用CA签署证书请求
openssl x509 -req -CA ca.crt -CAkey ca.key -in kafka.csr -out kafka.crt -days 365 -CAcreateserial -passin pass:kafka2024
# 将CA证书导入keystore
keytool -keystore kafka.keystore.jks -alias CARoot -import -file ca.crt -storepass kafka2024 -noprompt
# 将已签名的证书导入keystore
keytool -keystore kafka.keystore.jks -alias kafka -import -file kafka.crt -storepass kafka2024 -noprompt
# 创建truststore并导入CA证书(用于客户端信任)
keytool -keystore kafka.truststore.jks -alias CARoot -import -file ca.crt -storepass kafka2024 -noprompt
```
### 2. 创建docker-compose.yml文件
```yaml
version: '3'
services:
zookeeper:
image: bitnami/zookeeper:3.9
ports:
- "2181:2181"
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka:
image: bitnami/kafka:3.7
ports:
- "9093:9093" # 暴露SSL端口
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
# 配置监听器为SSL
- KAFKA_CFG_LISTENERS=SSL://:9093
# 注意:advertised.listeners的地址需要与生成证书时设置的CN匹配,这里我们使用kafka(因为容器名为kafka,在Docker网络内可用)
- KAFKA_CFG_ADVERTISED_LISTENERS=SSL://kafka:9093
# SSL相关配置
- KAFKA_SSL_KEYSTORE_LOCATION=/opt/bitnami/kafka/config/certs/kafka.keystore.jks
- KAFKA_SSL_KEYSTORE_PASSWORD=kafka2024
- KAFKA_SSL_KEY_PASSWORD=kafka2024
- KAFKA_SSL_TRUSTSTORE_LOCATION=/opt/bitnami/kafka/config/certs/kafka.truststore.jks
- KAFKA_SSL_TRUSTSTORE_PASSWORD=kafka2024
# 客户端认证方式:none表示单向认证(客户端不需要提供证书)
- KAFKA_SSL_CLIENT_AUTH=none
# 允许自动创建topic(测试用)
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
volumes:
# 将本地的certs目录挂载到容器的/opt/bitnami/kafka/config/certs目录
- ./certs:/opt/bitnami/kafka/config/certs
depends_on:
- zookeeper
```
注意:这里将证书挂载到了容器内的`/opt/bitnami/kafka/config/certs`目录,因为bitnami镜像中Kafka的配置默认路径是`/opt/bitnami/kafka/config`。
### 3. 启动服务
```bash
# 将之前生成的证书放入certs目录
mkdir -p certs
mv *.jks *.crt *.key *.csr *.srl certs/ # 注意:ca.key等文件也放入certs,但容器中只需要keystore和truststore
docker-compose up -d
```
### 4. 测试SSL连接
在容器内部执行测试命令:
```bash
# 进入kafka容器
docker exec -it kafka-kafka-1 bash
# 创建ssl.properties配置文件(在容器内)
cat > /opt/bitnami/kafka/config/ssl.properties <<EOF
security.protocol=SSL
ssl.truststore.location=/opt/bitnami/kafka/config/certs/kafka.truststore.jks
ssl.truststore.password=kafka2024
EOF
# 创建测试topic
/opt/bitnami/kafka/bin/kafka-topics.sh --create \
--bootstrap-server kafka:9093 \
--topic test \
--command-config /opt/bitnami/kafka/config/ssl.properties
# 生产消息
/opt/bitnami/kafka/bin/kafka-console-producer.sh \
--bootstrap-server kafka:9093 \
--topic test \
--producer.config /opt/bitnami/kafka/config/ssl.properties
# 在另一个终端消费消息
/opt/bitnami/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server kafka:9093 \
--topic test \
--from-beginning \
--consumer.config /opt/bitnami/kafka/config/ssl.properties
```
### 重要提醒
1. **证书CN与advertised.listeners的匹配**:在生成服务端证书时,我们设置的CN为`kafka`,因此在`advertised.listeners`中我们使用了`SSL://kafka:9093`。如果客户端使用IP连接,那么证书的CN应该设置为该IP(或域名),否则会遇到证书验证错误。在Docker网络内部,使用服务名`kafka`可以解析,所以没有问题。但如果外部客户端连接,需要设置合适的CN(比如宿主机IP)并配置对应的advertised.listeners。
2. **持久化**:如果需要持久化数据,可以在docker-compose.yml中为kafka服务添加卷,例如:
```yaml
volumes:
- ./kafka_data:/bitnami/kafka/data
```
3. **生产环境建议**:生产环境中应使用更安全的密码,并考虑使用双向认证(设置`KAFKA_SSL_CLIENT_AUTH=required`)[^2]。
### 相关问题
1. 如何在Docker中为Kafka配置SSL双向认证?
2. 如何配置Kafka客户端(如Java)使用SSL连接Kafka?
3. Kafka SSL证书过期后如何更新?
4. 如何配置Kafka的持久化存储以避免数据丢失?</think>### Docker部署Kafka简单SSL认证配置指南
以下是基于Docker部署Kafka并配置简单SSL认证的完整步骤(单向认证):
---
#### 1. **生成SSL证书**
```bash
# 创建证书目录
mkdir kafka-certs && cd kafka-certs
# 生成CA证书
openssl req -new -x509 -keyout ca.key -out ca.crt -days 365 -passout pass:kafka2024 -subj "/CN=Kafka CA"
# 生成服务端密钥库
keytool -keystore kafka.keystore.jks -alias kafka -validity 365 -genkey -keyalg RSA \
-storepass kafka2024 -keypass kafka2024 -dname "CN=kafka-server"
# 导入CA证书到密钥库
keytool -keystore kafka.keystore.jks -alias CARoot -import -file ca.crt \
-storepass kafka2024 -noprompt
# 创建信任库
keytool -keystore kafka.truststore.jks -alias CARoot -import -file ca.crt \
-storepass kafka2024 -noprompt
```
---
#### 2. **创建docker-compose.yml**
```yaml
version: '3.8'
services:
zookeeper:
image: bitnami/zookeeper:3.9
ports:
- "2181:2181"
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
volumes:
- zookeeper_data:/bitnami/zookeeper
kafka:
image: bitnami/kafka:3.7
ports:
- "9093:9093" # SSL端口
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=SSL:SSL
- KAFKA_CFG_LISTENERS=SSL://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=SSL://${HOST_IP}:9093
- KAFKA_SSL_KEYSTORE_LOCATION=/certs/kafka.keystore.jks
- KAFKA_SSL_KEYSTORE_PASSWORD=kafka2024
- KAFKA_SSL_KEY_PASSWORD=kafka2024
- KAFKA_SSL_TRUSTSTORE_LOCATION=/certs/kafka.truststore.jks
- KAFKA_SSL_TRUSTSTORE_PASSWORD=kafka2024
- KAFKA_SSL_CLIENT_AUTH=none # 单向认证
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
volumes:
- ./kafka-certs:/certs
- kafka_data:/bitnami/kafka
depends_on:
- zookeeper
volumes:
zookeeper_data:
kafka_data:
```
> **重要配置说明**:
> 1. 替换 `${HOST_IP}` 为宿主机实际IP(跨主机访问时必需)
> 2. 证书密码 `kafka2024` 需与实际生成一致
> 3. 卷挂载确保数据持久化[^2]
---
#### 3. **启动服务**
```bash
# 设置宿主机IP(Linux/macOS)
export HOST_IP=$(hostname -I | awk '{print $1}')
# Windows PowerShell: $env:HOST_IP = (Test-Connection -ComputerName $env:computername -Count 1).IPv4Address.IPAddressToString
docker-compose up -d
```
---
#### 4. **测试SSL连接**
```bash
# 进入Kafka容器
docker exec -it kafka-kafka-1 bash
# 创建SSL配置文件
cat > /opt/bitnami/kafka/config/ssl.properties <<EOF
security.protocol=SSL
ssl.truststore.location=/certs/kafka.truststore.jks
ssl.truststore.password=kafka2024
EOF
# 创建测试Topic
bin/kafka-topics.sh --create \
--bootstrap-server localhost:9093 \
--topic ssl-test \
--command-config config/ssl.properties
# 生产消息
bin/kafka-console-producer.sh \
--bootstrap-server localhost:9093 \
--topic ssl-test \
--producer.config config/ssl.properties
# 消费消息(新终端)
bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9093 \
--topic ssl-test \
--from-beginning \
--consumer.config config/ssl.properties
```
---
#### 关键注意事项:
1. **证书匹配**:`advertised.listeners` 的域名/IP必须与证书CN一致
2. **防火墙**:确保9093端口开放
3. **客户端配置**:Spring Boot需设置`security.protocol=SSL`和信任库路径[^1]
4. **生产环境**:
- 使用CA签发证书而非自签名
- 设置 `KAFKA_SSL_CLIENT_AUTH=required` 启用双向认证
- 配置副本因子保证高可用[^2]
---
### 相关问题
1. 如何为Kafka SSL配置双向认证(客户端证书验证)?
2. 在Spring Boot中如何配置SSL连接Kafka?[^1]
3. 如何更新Kafka的SSL证书而不中断服务?
4. Kafka SSL认证与SASL认证有何区别?如何选择?[^3]
阅读全文