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认证配置不一致,按以下步骤排查修复:
验证证书与私钥的配对性
用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-certSecret。检查证书链完整性
确认source-kafka-listener-cert中的tls.crt包含完整证书链(服务器证书+中间CA证书),而非仅服务器证书:openssl crl2pkcs7 -nocrl -certfile tls.crt | openssl pkcs7 -print_certs -noout输出应显示多个证书条目(从服务器证书到根CA)。若只有服务器证书,需将中间CA证书追加到
tls.crt末尾,更新Secret。配置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验证证书SAN字段
检查服务器证书的SAN字段是否包含所有集群域名(bootstrap.example.com、kafka-0.example.com等):openssl x509 -in tls.crt -text -noout | grep -A 1 "Subject Alternative Name"若缺失对应域名,需重新签发包含正确SAN的证书。
统一TLS版本与加密套件
在Kafka配置中强制指定兼容的TLS版本,避免版本不兼容导致握手失败:config: # 其他配置省略 ssl.enabled.protocols: TLSv1.2,TLSv1.3 ssl.protocol: TLSv1.2同时确保Kafka Connect镜像的JDK支持对应TLS版本,未禁用相关加密套件。
检查Secret访问权限
确认Strimzi集群操作员的服务账号有权限读取证书相关Secret:kubectl describe serviceaccount strimzi-cluster-operator kubectl get rolebindings | grep strimzi若权限不足,需添加对应的RoleBinding赋予Secret读取权限。
内容的提问来源于stack exchange,提问作者shiva

