使用SASL_SSL连接Azure K8s上的Strimzi Kafka时SSL握手失败
问题:Azure Kubernetes上Strimzi Kafka外部监听器SSL握手失败
我在Azure Kubernetes上部署了Strimzi Kafka集群,配置了监听器与认证规则,具体YAML配置如下:
authorization: type: simple listeners: - name: plain port: 9092 type: internal tls: false authentication: type: scram-sha-512 - name: external port: 9093 type: ingress tls: true authentication: type: scram-sha-512 configuration: class: nginx bootstrap: host: bootstrap-${domain} brokers: - broker: 0 host: broker-0-${domain} - broker: 1 host: broker-1-${domain} - broker: 2 host: broker-2-${domain}
错误现象
内部9092端口的非TLS监听器可正常完成SCRAM认证,但外部连接时客户端抛出错误:
ERROR [Producer clientId=console-producer] Connection to node -1 (kafka-kafka-external-bootstrap/10.0.67.251:9093) failed authentication due to: SSL handshake failed (org.apache.kafka.clients.NetworkClient)
服务端日志仅显示:
[SocketServer listenerType=ZK_BROKER, nodeId=0] Failed authentication with /10.224.0.30 (channelId=10.224.0.45:9093-10.224.0.30:50796-19968) (SSL handshake failed) (org.apache.kafka.common.network.Selector) [data-plane-kafka-network-thread-0-ListenerName(EXTERNAL-9093)-SASL_SSL-8]
排查尝试
- 最初怀疑是nginx官方Ingress控制器的TLS透传配置问题,但在集群内的kafka-client pod直接访问外部服务,仍出现相同错误
- 将监听器类型改为
loadbalancer后,问题依旧
客户端配置
Strimzi部署生成的Secret如下:
kafka-clients-ca Opaque 1 21h kafka-clients-ca-cert Opaque 3 21h kafka-cluster-ca Opaque 1 21h kafka-cluster-ca-cert Opaque 3 21h kafka-cluster-operator-certs Opaque 4 21h kafka-entity-topic-operator-certs Opaque 4 21h
我配置了client.properties文件:
security.protocol=SASL_SSL sasl.mechanism=SCRAM-SHA-512 sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="master" password="pwd"; ssl.truststore.location=/tmp/creds/cluster.p12 ssl.truststore.type=PKCS12 ssl.truststore.password=pwd
其中信任库cluster.p12来自Secret kafka-cluster-ca-cert -> ca.p12,密码来自kafka-cluster-ca-cert -> ca.password。该master用户在9092端口使用SASL_PLAINTEXT认证可正常工作。执行以下命令触发错误:
kafka-console-producer.sh \ --producer.config /tmp/creds/client.properties \ --broker-list kafka-kafka-external-bootstrap:9093 \ --topic test
可能的遗漏配置点
- CA证书选择错误:Strimzi中,
kafka-cluster-ca是供集群内部组件(如broker、operator)之间通信使用的CA,而外部客户端应该使用kafka-clients-ca-cert中的ca.p12作为信任库。你当前使用的是集群CA证书,可能不包含外部监听器主机名的SAN(Subject Alternative Name),导致SSL握手时主机名验证失败。 - 证书主机名验证问题:检查
kafka-clients-ca签发的证书是否包含外部监听器的主机名(bootstrap-${domain}、broker-0-${domain}等)。如果证书的SAN字段没有这些域名,客户端会因为主机名不匹配拒绝握手。 - SSL配置完整性:确认客户端配置中是否需要添加
ssl.endpoint.identification.algorithm=HTTPS(默认开启),如果你的外部域名与证书中的SAN完全匹配则无需修改,否则可以临时设置为""禁用验证来测试(生产环境不建议)。 - Ingress TCP透传配置(当使用ingress类型时):如果使用nginx Ingress控制器,需要确保已配置TCP服务透传,将9093端口转发到Kafka的外部监听器服务。虽然你切换到loadbalancer后问题依旧,但如果后续回到ingress模式,这一步必须配置。
内容的提问来源于stack exchange,提问作者barmanthewise
相关产品推荐
相关产品推荐

