Strimzi Kafka配置SCRAM认证及无证书TLS连接问题
Strimzi Kafka:实现SCRAM认证+单向TLS加密(无需客户端证书)
问题背景
已成功部署带SCRAM-SHA-512认证的Strimzi Kafka集群,并通过User Operator创建了用户,但客户端连接时被要求提供SSL证书。需要实现:
- 数据通过TLS加密传输
- Broker用SCRAM用户名密码认证客户端
- 无需客户端提供证书,也无需客户端部署证书(仅需验证Broker证书,测试环境可跳过验证)
解决方案:修改Listener的TLS配置
默认情况下,Strimzi的TLS listener启用双向认证(mutual TLS),要求客户端提供证书。只需修改Kafka集群的listener配置,关闭客户端证书验证,保留SCRAM认证和TLS加密即可。
1. 更新Kafka集群YAML
修改tls类型的listener,添加clientAuthentication: none字段,完整关键配置如下:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: version: 3.2.1 replicas: 1 listeners: - name: plain port: 9092 type: internal tls: false - name: tls port: 9093 type: internal tls: true clientAuthentication: none # 关闭客户端证书验证 authentication: type: scram-sha-512 # ... 其余资源、存储、metrics等配置保持不变 entityOperator: topicOperator: {} userOperator: {} # 必须启用User Operator管理SCRAM用户 # ... zookeeper、kafkaExporter配置保持不变
2. 客户端连接配置
客户端需使用SASL_SSL协议,指定SCRAM机制和用户名密码,同时可选验证Broker的CA证书(生产环境推荐):
Java客户端示例(properties文件)
bootstrap.servers=my-cluster-kafka-bootstrap:9093 security.protocol=SASL_SSL sasl.mechanism=SCRAM-SHA-512 # 替换为你的用户名和从Secret中获取的密码 sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="my-user" password="XXXXX"; # 生产环境:验证Broker证书,需要Strimzi生成的CA证书 ssl.truststore.type=PEM ssl.truststore.certificates=-----BEGIN CERTIFICATE----- # 粘贴my-cluster-cluster-ca-cert Secret中的ca.crt内容 -----END CERTIFICATE----- # 测试环境:可跳过Broker证书验证(不建议生产) # ssl.endpoint.identification.algorithm= # ssl.truststore.type=PEM # ssl.truststore.certificates=
获取Broker CA证书
Strimzi会自动创建my-cluster-cluster-ca-cert Secret,执行以下命令获取CA证书:
kubectl get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d
初始配置错误说明
你最初在listener的authentication字段中添加usernameSecretRef、passwordSecretRef等字段是错误的:
- Strimzi中,Broker listener的
authentication仅需指定认证类型(如scram-sha-512),具体用户由KafkaUser资源创建,User Operator会将用户信息同步到ZooKeeper,Broker自动读取完成认证。 - 无需在Broker配置中硬编码或引用单个用户凭证,User Operator负责用户生命周期管理。
内容的提问来源于stack exchange,提问作者Faheem Sultan
相关产品推荐
相关产品推荐

