在 Kafka 中配置 SSL/TLS 证书认证(核心是双向认证 ,客户端验证 broker、broker 验证客户端)需完成证书准备、Broker 配置、客户端配置三大核心步骤,以下是详细实操指南(基于 Kafka 2.8+,JKS 格式证书)。
一、核心概念梳理
- 单向认证:仅客户端验证 Broker 的服务端证书(确保连接的是合法 Broker),无需客户端证书;
- 双向认证:Broker 验证客户端证书 + 客户端验证 Broker 证书(最高安全等级,生产推荐);
- 密钥库(keystore):存储自身证书 + 私钥(如 Broker 的 server.keystore.jks、客户端的 client.keystore.jks);
- 信任库(truststore):存储信任的 CA 证书(验证对方证书合法性,如 Broker 的 truststore 存储 CA 根证书,用于验证客户端证书)。
二、步骤 1:生成 SSL 证书(自签名 CA + 服务端 / 客户端证书)
生产环境建议使用企业 CA 签发证书,测试环境可自签名,以下用 Java keytool 工具生成全套证书:
1. 生成 CA 根证书(信任锚)
bash
运行
# 生成CA密钥库(存储CA私钥+证书),有效期3650天
keytool -genkeypair -alias ca -keyalg RSA -keysize 2048 -validity 3650 \
-keystore ca.keystore.jks \
-dname "CN=KafkaCA,OU=IT,O=Example,L=Beijing,ST=Beijing,C=CN" \
-storepass ca123456 \
-keypass ca123456 \
-ext keyUsage=critical,keyCertSign \
-ext basicConstraints=critical,CA:true
# 导出CA证书(供Broker/客户端信任库使用)
keytool -exportcert -alias ca -file ca.crt \
-keystore ca.keystore.jks \
-storepass ca123456 \
-rfc
2. 生成 Broker 服务端证书(由 CA 签名)
bash
运行
# 1. 生成Broker密钥库(存储Broker私钥+证书请求)
keytool -genkeypair -alias broker -keyalg RSA -keysize 2048 -validity 3650 \
-keystore server.keystore.jks \
-dname "CN=kafka-broker,OU=IT,O=Example,L=Beijing,ST=Beijing,C=CN" \
-storepass broker123456 \
-keypass broker123456
# 2. 生成Broker证书签名请求(CSR)
keytool -certreq -alias broker -file broker.csr \
-keystore server.keystore.jks \
-storepass broker123456
# 3. CA签名Broker证书
keytool -gencert -alias ca -infile broker.csr -outfile broker.crt \
-keystore ca.keystore.jks \
-storepass ca123456 \
-keypass ca123456 \
-validity 3650 \
-ext keyUsage=critical,digitalSignature,keyEncipherment \
-ext extendedKeyUsage=serverAuth \
-ext subjectAltName=DNS:kafka-broker,DNS:localhost,IP:127.0.0.1
# 4. 将CA证书+签名后的Broker证书导入Broker密钥库
# 先导入CA根证书
keytool -importcert -alias ca -file ca.crt \
-keystore server.keystore.jks \
-storepass broker123456 \
-noprompt
# 再导入签名后的Broker证书
keytool -importcert -alias broker -file broker.crt \
-keystore server.keystore.jks \
-storepass broker123456 \
-noprompt
3. 生成客户端证书(由 CA 签名,双向认证需)
bash
运行
# 1. 生成客户端密钥库
keytool -genkeypair -alias client -keyalg RSA -keysize 2048 -validity 3650 \
-keystore client.keystore.jks \
-dname "CN=kafka-client,OU=IT,O=Example,L=Beijing,ST=Beijing,C=CN" \
-storepass client123456 \
-keypass client123456
# 2. 生成客户端CSR
keytool -certreq -alias client -file client.csr \
-keystore client.keystore.jks \
-storepass client123456
# 3. CA签名客户端证书
keytool -gencert -alias ca -infile client.csr -outfile client.crt \
-keystore ca.keystore.jks \
-storepass ca123456 \
-keypass ca123456 \
-validity 3650 \
-ext keyUsage=critical,digitalSignature,keyEncipherment \
-ext extendedKeyUsage=clientAuth
# 4. 导入CA证书+客户端证书到客户端密钥库
keytool -importcert -alias ca -file ca.crt \
-keystore client.keystore.jks \
-storepass client123456 \
-noprompt
keytool -importcert -alias client -file client.crt \
-keystore client.keystore.jks \
-storepass client123456 \
-noprompt
4. 生成 Broker / 客户端信任库(存储 CA 根证书)
bash
运行
# Broker信任库(验证客户端证书)
keytool -importcert -alias ca -file ca.crt \
-keystore server.truststore.jks \
-storepass trust123456 \
-noprompt
# 客户端信任库(验证Broker证书)
keytool -importcert -alias ca -file ca.crt \
-keystore client.truststore.jks \
-storepass trust123456 \
-noprompt
三、步骤 2:配置 Broker 启用 SSL 认证
修改 Kafka Broker 配置文件(server.properties),核心配置如下:
properties
# ====================== SSL 基础配置 ======================
# 启用SSL监听器(端口建议9093,区分普通端口)
listeners=SSL://:9093
# 对外暴露的SSL地址(如集群域名/IP)
advertised.listeners=SSL://kafka-broker:9093
# ====================== 密钥库/信任库配置 ======================
# Broker自身密钥库(服务端证书+私钥)
ssl.keystore.location=/opt/kafka/config/certs/server.keystore.jks
ssl.keystore.password=broker123456
ssl.key.password=broker123456
# Broker信任库(CA根证书,用于验证客户端证书)
ssl.truststore.location=/opt/kafka/config/certs/server.truststore.jks
ssl.truststore.password=trust123456
# ====================== 双向认证配置 ======================
# 强制验证客户端证书(双向认证),单向认证设为none
ssl.client.auth=required
# ====================== SSL 高级配置(可选) ======================
# 支持的SSL协议(禁用低版本)
ssl.enabled.protocols=TLSv1.2,TLSv1.3
# 加密套件(强加密)
ssl.cipher.suites=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384
# 证书类型
ssl.keystore.type=JKS
ssl.truststore.type=JKS
配置完成后,重启 Broker:
bash
运行
# 停止Broker
kafka-server-stop.sh
# 启动Broker(指定配置文件)
kafka-server-start.sh -daemon /opt/kafka/config/server.properties
四、步骤 3:配置客户端(生产者 / 消费者)启用 SSL
客户端需配置 SSL 参数,以 Java 客户端为例(producer.properties/consumer.properties):
生产者配置(producer.properties)
properties
# 连接Broker的SSL地址
bootstrap.servers=kafka-broker:9093
# ====================== SSL 配置 ======================
# 客户端密钥库(客户端证书+私钥)
ssl.keystore.location=/opt/kafka/config/certs/client.keystore.jks
ssl.keystore.password=client123456
ssl.key.password=client123456
# 客户端信任库(CA根证书,验证Broker证书)
ssl.truststore.location=/opt/kafka/config/certs/client.truststore.jks
ssl.truststore.password=trust123456
# SSL高级配置
ssl.enabled.protocols=TLSv1.2,TLSv1.3
ssl.keystore.type=JKS
ssl.truststore.type=JKS
消费者配置(consumer.properties)
properties
# 连接Broker的SSL地址
bootstrap.servers=kafka-broker:9093
group.id=test-group
# ====================== SSL 配置(同生产者) ======================
ssl.keystore.location=/opt/kafka/config/certs/client.keystore.jks
ssl.keystore.password=client123456
ssl.key.password=client123456
ssl.truststore.location=/opt/kafka/config/certs/client.truststore.jks
ssl.truststore.password=trust123456
ssl.enabled.protocols=TLSv1.2,TLSv1.3
五、步骤 4:验证 SSL 认证是否生效
1. 测试 Broker SSL 连通性
使用 Kafka 自带工具验证 SSL 配置:
bash
运行
# 检查Broker SSL端口是否正常
openssl s_client -connect kafka-broker:9093 -tls1_2
# 用kafka-configs.sh验证SSL配置
kafka-configs.sh --bootstrap-server kafka-broker:9093 --describe --entity-type brokers --entity-name 0 --command-config client.properties
2. 测试生产者 / 消费者发送消息
bash
运行
# 1. 创建测试主题(需通过SSL连接)
kafka-topics.sh --bootstrap-server kafka-broker:9093 --create --topic ssl-test --partitions 1 --replication-factor 1 --command-config client.properties
# 2. 启动生产者(SSL认证)
kafka-console-producer.sh --bootstrap-server kafka-broker:9093 --topic ssl-test --producer.config producer.properties
# 3. 启动消费者(SSL认证)
kafka-console-consumer.sh --bootstrap-server kafka-broker:9093 --topic ssl-test --from-beginning --consumer.config consumer.properties
若能正常发送 / 接收消息,说明 SSL 双向认证配置成功。
六、生产环境注意事项
- 证书管理 :
- 避免自签名证书,使用企业 CA 或公有 CA(如 Let's Encrypt)签发;
- 定期轮换证书(设置合理有效期,如 1 年),避免证书过期导致服务中断;
- 妥善保管密钥库 / 信任库密码,避免硬编码(可通过环境变量 / 密钥管理工具读取)。
- 性能优化 :
- SSL 握手会增加开销,建议开启连接复用(客户端配置
connections.max.idle.ms); - 选择高效的加密套件(如 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)。
- SSL 握手会增加开销,建议开启连接复用(客户端配置
- 监控告警 :
- 监控 SSL 握手失败次数(Kafka 指标
ssl.handshake.failures); - 配置证书过期告警(提前 30 天提醒)。
- 监控 SSL 握手失败次数(Kafka 指标
- 兼容配置 :
-
若需同时支持 SSL 和非 SSL 连接,可配置多监听器: properties
listeners=PLAINTEXT://:9092,SSL://:9093 advertised.listeners=PLAINTEXT://kafka-broker:9092,SSL://kafka-broker:9093
-
七、常见问题排查
- SSL 握手失败 :
- 检查证书 CN/SubjectAltName 是否匹配 Broker 域名(客户端连接的地址需与证书中的 DNS/IP 一致);
- 检查
ssl.client.auth=required时,客户端是否未配置证书; - 查看 Broker 日志(
logs/server.log),关键词SSL handshake failed。
- 证书信任问题 :
- 确认客户端信任库包含 Broker 证书的 CA 根证书;
- 检查证书链是否完整(Broker 证书需能追溯到 CA 根证书)。
- 密码错误 :
- 验证密钥库 / 信任库密码是否正确(
keytool -list -keystore server.keystore.jks可测试密码)。
- 验证密钥库 / 信任库密码是否正确(
详细说明在Kafka中配置SSL/TLS证书认证的步骤
在 Kafka 中配置 SSL/TLS 证书认证的核心是实现双向身份验证 (Broker 验证客户端、客户端验证 Broker),全流程可拆解为 证书体系搭建、Broker 端 SSL 配置、客户端 SSL 配置、功能验证、生产级优化 五大核心阶段,以下是逐步骤的详细实操指南(基于 Kafka 3.x 版本,JKS 格式证书,适配 Linux 环境)。
前置准备
-
环境依赖:确保所有 Kafka 节点安装 JDK(推荐 11+),
keytool工具(JDK 自带)可用; -
目录规划:创建证书专用目录(如
/opt/kafka/certs),统一存放密钥库、信任库、证书文件; -
权限管控:证书目录仅对 Kafka 运行用户(如
kafka)可读,避免权限泄露:bash
运行
mkdir -p /opt/kafka/certs && chown -R kafka:kafka /opt/kafka/certs && chmod 700 /opt/kafka/certs
阶段一:搭建 SSL 证书体系(核心)
SSL 认证的核心是「CA 根证书 + 服务端证书(Broker) + 客户端证书」的信任链,生产环境推荐使用企业 / 公有 CA 签发证书,测试环境可自签名(以下以自签名 CA 为例)。
步骤 1:生成 CA 根证书(信任锚)
CA 根证书是整个信任体系的核心,Broker 和客户端均通过它验证对方证书的合法性。
bash
运行
# 切换到证书目录
cd /opt/kafka/certs
# 1. 生成 CA 密钥库(存储 CA 私钥和自签名证书)
# -alias ca:CA 证书别名
# -dname:证书身份信息(CN 为核心,测试环境可随意,生产需匹配企业信息)
# -ext:标记该证书为 CA 证书,具备签名权限
keytool -genkeypair \
-alias ca \
-keyalg RSA \
-keysize 2048 \
-validity 3650 \ # 有效期 10 年
-keystore ca.keystore.jks \
-dname "CN=KafkaCA,OU=Tech,O=Example,L=Beijing,ST=Beijing,C=CN" \
-storepass Ca@123456 \ # CA 密钥库密码(生产需强密码)
-keypass Ca@123456 \ # CA 私钥密码
-ext keyUsage=critical,keyCertSign \
-ext basicConstraints=critical,CA:true
# 2. 导出 CA 根证书(供 Broker/客户端信任库导入)
keytool -exportcert \
-alias ca \
-file ca.crt \
-keystore ca.keystore.jks \
-storepass Ca@123456 \
-rfc # 输出 PEM 格式(通用格式)
步骤 2:生成 Broker 服务端证书(CA 签名)
Broker 服务端证书用于证明自身身份,需由 CA 根证书签名,确保客户端可验证其合法性。
bash
运行
# 1. 生成 Broker 密钥库(存储 Broker 私钥 + 证书请求)
keytool -genkeypair \
-alias broker \
-keyalg RSA \
-keysize 2048 \
-validity 365 \ # 服务端证书有效期 1 年(生产建议缩短)
-keystore server.keystore.jks \
-dname "CN=kafka-broker-01,OU=Tech,O=Example,L=Beijing,ST=Beijing,C=CN" \
-storepass Broker@123456 \ # Broker 密钥库密码
-keypass Broker@123456 \ # Broker 私钥密码
-ext san=DNS:kafka-broker-01,DNS:localhost,IP:192.168.1.100 # 关键:SAN 扩展(必须包含 Broker 访问地址)
# 2. 生成 Broker 证书签名请求(CSR)
keytool -certreq \
-alias broker \
-file broker.csr \
-keystore server.keystore.jks \
-storepass Broker@123456
# 3. CA 签名 Broker 证书(用 CA 根证书验证 CSR 并生成签名证书)
keytool -gencert \
-alias ca \
-infile broker.csr \
-outfile broker.crt \
-keystore ca.keystore.jks \
-storepass Ca@123456 \
-keypass Ca@123456 \
-validity 365 \
-ext keyUsage=critical,digitalSignature,keyEncipherment \
-ext extendedKeyUsage=serverAuth \ # 标记为服务端证书
-ext san=DNS:kafka-broker-01,DNS:localhost,IP:192.168.1.100 # 需与 Broker 密钥库的 SAN 一致
# 4. 导入 CA 根证书 + 签名后的 Broker 证书到 Broker 密钥库(完成证书链)
# 先导入 CA 根证书(Broker 需信任自身的签发CA)
keytool -importcert \
-alias ca \
-file ca.crt \
-keystore server.keystore.jks \
-storepass Broker@123456 \
-noprompt # 跳过交互确认
# 再导入 CA 签名的 Broker 证书
keytool -importcert \
-alias broker \
-file broker.crt \
-keystore server.keystore.jks \
-storepass Broker@123456 \
-noprompt
步骤 3:生成客户端证书(CA 签名,双向认证需)
客户端证书用于 Broker 验证客户端身份,流程与 Broker 证书类似:
bash
运行
# 1. 生成客户端密钥库
keytool -genkeypair \
-alias client \
-keyalg RSA \
-keysize 2048 \
-validity 365 \
-keystore client.keystore.jks \
-dname "CN=kafka-client,OU=Tech,O=Example,L=Beijing,ST=Beijing,C=CN" \
-storepass Client@123456 \
-keypass Client@123456 \
-ext extendedKeyUsage=clientAuth # 标记为客户端证书
# 2. 生成客户端 CSR
keytool -certreq \
-alias client \
-file client.csr \
-keystore client.keystore.jks \
-storepass Client@123456
# 3. CA 签名客户端证书
keytool -gencert \
-alias ca \
-infile client.csr \
-outfile client.crt \
-keystore ca.keystore.jks \
-storepass Ca@123456 \
-keypass Ca@123456 \
-validity 365 \
-ext keyUsage=critical,digitalSignature,keyEncipherment \
-ext extendedKeyUsage=clientAuth
# 4. 导入 CA 根证书 + 签名后的客户端证书到客户端密钥库
keytool -importcert \
-alias ca \
-file ca.crt \
-keystore client.keystore.jks \
-storepass Client@123456 \
-noprompt
keytool -importcert \
-alias client \
-file client.crt \
-keystore client.keystore.jks \
-storepass Client@123456 \
-noprompt
步骤 4:生成 Broker / 客户端信任库
信任库用于存储「信任的 CA 根证书」,Broker 通过信任库验证客户端证书,客户端通过信任库验证 Broker 证书:
bash
运行
# 1. 生成 Broker 信任库(验证客户端证书)
keytool -importcert \
-alias ca \
-file ca.crt \
-keystore server.truststore.jks \
-storepass Trust@123456 \
-noprompt
# 2. 生成客户端信任库(验证 Broker 证书)
keytool -importcert \
-alias ca \
-file ca.crt \
-keystore client.truststore.jks \
-storepass Trust@123456 \
-noprompt
验证证书有效性(可选)
bash
运行
# 检查 Broker 密钥库内容(确认证书链完整)
keytool -list -v -keystore server.keystore.jks -storepass Broker@123456
# 检查证书有效期
keytool -printcert -file broker.crt
阶段二:配置 Broker 启用 SSL/TLS 认证
修改 Kafka Broker 的核心配置文件 server.properties(默认路径 /opt/kafka/config/server.properties),分「基础配置、SSL 核心配置、高级优化」三部分。
步骤 1:基础监听器配置
启用 SSL 监听器,指定端口(推荐 9093,区分 PLAINTEXT 端口):
properties
# 监听地址(SSL 端口 9093,若需兼容 PLAINTEXT 可追加 PLAINTEXT://:9092)
listeners=SSL://:9093
# 对外暴露的 SSL 地址(需与 Broker 证书的 SAN 匹配,如域名/IP)
advertised.listeners=SSL://192.168.1.100:9093
# 跨 Broker 通信的协议(集群模式需配置为 SSL)
inter.broker.listener.name=SSL
步骤 2:SSL 核心配置(必选)
properties
# ====================== 密钥库配置(Broker 自身证书) ======================
# Broker 密钥库路径(绝对路径)
ssl.keystore.location=/opt/kafka/certs/server.keystore.jks
# 密钥库密码
ssl.keystore.password=Broker@123456
# 私钥密码(与密钥库密码可不同)
ssl.key.password=Broker@123456
# ====================== 信任库配置(验证客户端证书) ======================
# Broker 信任库路径
ssl.truststore.location=/opt/kafka/certs/server.truststore.jks
# 信任库密码
ssl.truststore.password=Trust@123456
# ====================== 双向认证开关 ======================
# required:强制验证客户端证书(双向认证,生产推荐)
# request:可选验证客户端证书
# none:仅验证 Broker 证书(单向认证)
ssl.client.auth=required
# ====================== 证书/协议基础配置 ======================
# 密钥库/信任库类型(JKS 或 PKCS12,生产推荐 PKCS12)
ssl.keystore.type=JKS
ssl.truststore.type=JKS
# 启用的 SSL 协议(禁用低版本如 TLSv1.1)
ssl.enabled.protocols=TLSv1.2,TLSv1.3
步骤 3:SSL 高级优化(可选,生产推荐)
properties
# 加密套件(选择高性能、高安全的套件)
ssl.cipher.suites=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384
# SSL 会话缓存大小(减少握手开销)
ssl.secure.random.implementation=SHA1PRNG
# 会话超时时间(默认 300 秒)
ssl.keymanager.algorithm=SunX509
步骤 4:重启 Broker 并验证配置
bash
运行
# 停止 Broker(kafka 用户执行)
su - kafka -c "kafka-server-stop.sh"
# 启动 Broker(指定配置文件,后台运行)
su - kafka -c "kafka-server-start.sh -daemon /opt/kafka/config/server.properties"
# 检查 Broker 日志(确认 SSL 启动成功)
tail -f /opt/kafka/logs/server.log | grep "SSL"
# 成功日志示例:"Started SSL listener on port 9093"
阶段三:配置客户端启用 SSL/TLS 认证
客户端(生产者 / 消费者 / 命令行工具)需配置 SSL 参数,验证 Broker 身份并提供自身证书(双向认证)。
步骤 1:生产者配置(producer.properties)
创建 / 修改生产者配置文件(/opt/kafka/config/producer.properties):
properties
# 连接的 Broker SSL 地址(与 advertised.listeners 一致)
bootstrap.servers=192.168.1.100:9093
# ====================== 客户端 SSL 配置 ======================
# 客户端密钥库(自身证书)
ssl.keystore.location=/opt/kafka/certs/client.keystore.jks
ssl.keystore.password=Client@123456
ssl.key.password=Client@123456
# 客户端信任库(验证 Broker 证书)
ssl.truststore.location=/opt/kafka/certs/client.truststore.jks
ssl.truststore.password=Trust@123456
# 协议/加密配置(与 Broker 一致)
ssl.enabled.protocols=TLSv1.2,TLSv1.3
ssl.keystore.type=JKS
ssl.truststore.type=JKS
# 双向认证需开启(默认 true,无需修改)
ssl.endpoint.identification.algorithm=HTTPS # 验证 Broker 证书的 SAN/CN
步骤 2:消费者配置(consumer.properties)
创建 / 修改消费者配置文件(/opt/kafka/config/consumer.properties):
properties
# 连接的 Broker SSL 地址
bootstrap.servers=192.168.1.100:9093
# 消费者组 ID
group.id=ssl-test-group
# ====================== 客户端 SSL 配置(与生产者一致) ======================
ssl.keystore.location=/opt/kafka/certs/client.keystore.jks
ssl.keystore.password=Client@123456
ssl.key.password=Client@123456
ssl.truststore.location=/opt/kafka/certs/client.truststore.jks
ssl.truststore.password=Trust@123456
ssl.enabled.protocols=TLSv1.2,TLSv1.3
ssl.keystore.type=JKS
ssl.truststore.type=JKS
ssl.endpoint.identification.algorithm=HTTPS
步骤 3:命令行工具配置(client.properties)
Kafka 自带工具(如 kafka-topics.sh/kafka-console-producer.sh)需通过统一配置文件启用 SSL:创建 /opt/kafka/config/client.properties:
properties
bootstrap.servers=192.168.1.100:9093
ssl.keystore.location=/opt/kafka/certs/client.keystore.jks
ssl.keystore.password=Client@123456
ssl.key.password=Client@123456
ssl.truststore.location=/opt/kafka/certs/client.truststore.jks
ssl.truststore.password=Trust@123456
ssl.enabled.protocols=TLSv1.2,TLSv1.3
ssl.keystore.type=JKS
ssl.truststore.type=JKS
ssl.endpoint.identification.algorithm=HTTPS
阶段四:验证 SSL/TLS 认证有效性
步骤 1:验证 Broker SSL 端口连通性
bash
运行
# 使用 openssl 测试 SSL 握手(需安装 openssl)
openssl s_client -connect 192.168.1.100:9093 -tls1_2
# 成功标志:输出 "SSL handshake has read XXX bytes and written XXX bytes",且证书信息匹配
步骤 2:创建测试主题(SSL 连接)
bash
运行
su - kafka -c "kafka-topics.sh \
--bootstrap-server 192.168.1.100:9093 \
--create \
--topic ssl-test-topic \
--partitions 1 \
--replication-factor 1 \
--command-config /opt/kafka/config/client.properties"
# 验证主题创建成功
su - kafka -c "kafka-topics.sh \
--bootstrap-server 192.168.1.100:9093 \
--list \
--command-config /opt/kafka/config/client.properties"
步骤 3:测试生产者 / 消费者消息收发
bash
运行
# 启动生产者(SSL 认证)
su - kafka -c "kafka-console-producer.sh \
--bootstrap-server 192.168.1.100:9093 \
--topic ssl-test-topic \
--producer.config /opt/kafka/config/producer.properties"
# 另开终端,启动消费者(SSL 认证)
su - kafka -c "kafka-console-consumer.sh \
--bootstrap-server 192.168.1.100:9093 \
--topic ssl-test-topic \
--from-beginning \
--consumer.config /opt/kafka/config/consumer.properties"
# 生产者输入消息(如 "hello ssl"),消费者能接收则认证成功
阶段五:生产环境关键优化与注意事项
1. 证书管理(核心)
-
替换自签名证书:生产环境禁止使用自签名 CA,改用企业 CA(如微软 AD CS)或公有 CA(Let's Encrypt);
-
证书轮换:设置证书有效期为 1 年,提前 30 天轮换,避免过期中断服务;
-
密码安全 :禁止硬编码密码,通过环境变量 / 密钥管理工具(如 Vault)注入:
bash
运行
# 示例:通过环境变量传递密码 export KAFKA_SSL_KEYSTORE_PASSWORD=Broker@123456 # server.properties 中引用 ssl.keystore.password=${KAFKA_SSL_KEYSTORE_PASSWORD}
2. 性能优化
-
连接复用 :客户端配置
connections.max.idle.ms=3600000(1 小时),减少 SSL 握手次数; -
加密套件优化 :优先选择 ECDHE 系列套件(如
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384),兼顾安全与性能; -
JVM 优化 :调整 JVM 安全参数,增加 SSL 会话缓存:
bash
运行
# 在 kafka-server-start.sh 的 JVM 参数中追加 -Djavax.net.ssl.sessionCacheSize=10000 \ -Djavax.net.ssl.sessionTimeout=3600
3. 监控与告警
-
关键指标 :监控
ssl.handshake.failures(SSL 握手失败数)、network.ssl.authentication.failed(认证失败数); -
证书过期告警 :通过
keytool脚本检查证书有效期,配置邮件 / 钉钉告警:bash
运行
# 检查 Broker 证书有效期(剩余天数 < 30 则告警) keytool -list -v -keystore server.keystore.jks -storepass Broker@123456 | grep "Valid until"
4. 集群配置(多 Broker)
- 所有 Broker 使用相同 CA 根证书签发的服务端证书;
- 确保每个 Broker 的证书 SAN 包含自身的 IP / 域名;
- 跨 Broker 通信的
inter.broker.listener.name=SSL,确保集群内通信也走 SSL。
常见问题排查
| 问题现象 | 排查方向 |
|---|---|
| SSL 握手失败 | 1. 检查 Broker 证书的 SAN 是否与客户端连接的 IP / 域名一致;2. 确认 ssl.client.auth=required 时客户端配置了证书;3. 查看 Broker 日志 logs/server.log,关键词 SSL handshake failed |
| 证书信任错误 | 1. 验证信任库是否包含对方证书的 CA 根证书;2. 检查证书链是否完整(Broker / 客户端证书需追溯到 CA 根证书) |
| 密码错误 | 用 keytool -list -keystore server.keystore.jks 测试密码是否正确 |
| 端口不通 | 检查防火墙 / 安全组是否放行 9093 端口;验证 Broker 监听器配置是否正确(listeners=SSL://:9093) |
总结
Kafka SSL/TLS 认证配置的核心是「完整的证书链 + 两端一致的 SSL 配置 + 严格的身份验证」,测试环境可通过自签名 CA 快速验证,生产环境需重点关注证书管理、性能优化和监控告警,确保安全与可用性兼顾。