You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

可能的遗漏配置点

  1. CA证书选择错误:Strimzi中,kafka-cluster-ca是供集群内部组件(如broker、operator)之间通信使用的CA,而外部客户端应该使用kafka-clients-ca-cert中的ca.p12作为信任库。你当前使用的是集群CA证书,可能不包含外部监听器主机名的SAN(Subject Alternative Name),导致SSL握手时主机名验证失败。
  2. 证书主机名验证问题:检查kafka-clients-ca签发的证书是否包含外部监听器的主机名(bootstrap-${domain}、broker-0-${domain}等)。如果证书的SAN字段没有这些域名,客户端会因为主机名不匹配拒绝握手。
  3. SSL配置完整性:确认客户端配置中是否需要添加ssl.endpoint.identification.algorithm=HTTPS(默认开启),如果你的外部域名与证书中的SAN完全匹配则无需修改,否则可以临时设置为""禁用验证来测试(生产环境不建议)。
  4. Ingress TCP透传配置(当使用ingress类型时):如果使用nginx Ingress控制器,需要确保已配置TCP服务透传,将9093端口转发到Kafka的外部监听器服务。虽然你切换到loadbalancer后问题依旧,但如果后续回到ingress模式,这一步必须配置。

内容的提问来源于stack exchange,提问作者barmanthewise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:13:21