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

Azure AKS上Strimzi Kafka外部TLS认证访问故障求助

问题描述

在Azure AKS中部署Strimzi Kafka集群后,尝试通过TLS认证从外部访问时遇到SSL握手错误。已使用自定义证书配置外部监听器,Kafka Connect端也配置了相同证书,且信任库中添加了所有CA证书,未修改Strimzi自动生成的cluster-ca-cert或clients-ca-cert。

错误日志

2022-09-13 09:39:34,227 WARN [AdminClient clientId=adminclient-1] Metadata update failed due to authentication error
org.apache.kafka.clients.admin.internals.AdminMetadataManager) [kafka-admin-client-thread | adminclient-1]
org.apache.kafka.common.errors.SslAuthenticationException: Failed to process post-handshake messages
Caused by: javax.net.ssl.SSLException: Tag mismatch!

Kafka集群核心配置

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: eesb-cluster
spec:
  kafka:
    version: 3.1.0
    replicas: 3
    # 其他资源、探针配置省略
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: external
        port: 9093
        type: loadbalancer
        tls: true
        authentication:
          type: tls  
        configuration:
          bootstrap:
            loadBalancerIP: 20.22.199.99
            annotations:
              external-dns.alpha.kubernetes.io/hostname: bootstrap.example.com
            alternativeNames: 
                - bootstrap.example.com  
          brokers:
          - broker: 0
            loadBalancerIP: 20.22.199.100
            annotations:
              external-dns.alpha.kubernetes.io/hostname: kafka-0.example.com
            advertisedHost: kafka-0.example.com
          - broker: 1
            loadBalancerIP: 20.22.199.101
            annotations:
              external-dns.alpha.kubernetes.io/hostname: kafka-1.example.com
            advertisedHost: kafka-1.example.com
          - broker: 2
            loadBalancerIP: 20.22.199.102
            annotations:
              external-dns.alpha.kubernetes.io/hostname: kafka-2.example.com
            advertisedHost: kafka-2.example.com
          brokerCertChainAndKey:
            secretName: source-kafka-listener-cert
            certificate: tls.crt
            key: tls.key 
    # 其他存储、配置省略
  zookeeper:
    # zookeeper配置省略

Kafka Connect核心配置

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: eesb-connect-cluster
  annotations:
    strimzi.io/use-connector-resources: "true"
spec:
  version: 3.1.0
  bootstrapServers: itaag108-uat2.eesb.eurofins.com:9093
  authentication:
    type: tls
    certificateAndKey:
      certificate: tls.crt
      key: tls.key
      secretName: source-kafka-listener-cert
  tls:
    trustedCertificates:
      - certificate: ca1.crt
        secretName: source-kafka-trust-cert
      - certificate: ca2.crt
        secretName: source-kafka-trust-cert
      - certificate: ca3.crt
        secretName: source-kafka-trust-cert
  # 其他转换器、资源配置省略
解决方案

Tag mismatch!错误通常源于证书密钥不匹配、证书链不完整或TLS认证配置不一致,按以下步骤排查修复:

  1. 验证证书与私钥的配对性
    用OpenSSL检查证书和私钥是否属于同一对:

    # 提取证书公钥
    openssl x509 -in tls.crt -pubkey -noout > cert_pub.key
    # 提取私钥公钥
    openssl rsa -in tls.key -pubout -noout > key_pub.key
    # 对比两个文件内容
    diff cert_pub.key key_pub.key
    

    若输出不一致,说明证书和私钥不匹配,需替换为正确配对的文件,重新创建source-kafka-listener-cert Secret。

  2. 检查证书链完整性
    确认source-kafka-listener-cert中的tls.crt包含完整证书链(服务器证书+中间CA证书),而非仅服务器证书:

    openssl crl2pkcs7 -nocrl -certfile tls.crt | openssl pkcs7 -print_certs -noout
    

    输出应显示多个证书条目(从服务器证书到根CA)。若只有服务器证书,需将中间CA证书追加到tls.crt末尾,更新Secret。

  3. 配置Kafka监听器的信任CA
    外部监听器启用了TLS客户端认证,但当前未指定信任的CA,Kafka会默认使用clients-ca验证客户端证书,导致认证失败。需在监听器配置中添加信任CA:

    listeners:
      - name: external
        # 其他配置省略
        authentication:
          type: tls
          trustedCertificates:
            - certificate: ca1.crt
              secretName: source-kafka-trust-cert
            - certificate: ca2.crt
              secretName: source-kafka-trust-cert
            - certificate: ca3.crt
              secretName: source-kafka-trust-cert
    
  4. 验证证书SAN字段
    检查服务器证书的SAN字段是否包含所有集群域名(bootstrap.example.com、kafka-0.example.com等):

    openssl x509 -in tls.crt -text -noout | grep -A 1 "Subject Alternative Name"
    

    若缺失对应域名,需重新签发包含正确SAN的证书。

  5. 统一TLS版本与加密套件
    在Kafka配置中强制指定兼容的TLS版本,避免版本不兼容导致握手失败:

    config:
      # 其他配置省略
      ssl.enabled.protocols: TLSv1.2,TLSv1.3
      ssl.protocol: TLSv1.2
    

    同时确保Kafka Connect镜像的JDK支持对应TLS版本,未禁用相关加密套件。

  6. 检查Secret访问权限
    确认Strimzi集群操作员的服务账号有权限读取证书相关Secret:

    kubectl describe serviceaccount strimzi-cluster-operator
    kubectl get rolebindings | grep strimzi
    

    若权限不足,需添加对应的RoleBinding赋予Secret读取权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:26:16