如何在Bitnami Kafka中使用Let's Encrypt证书及排障
使用Bitnami Kafka Helm Chart配置SASL_TLS+Let's Encrypt证书的连接问题
我们通过Let's Encrypt和cert-manager签发证书,使用Bitnami Kafka Helm Chart的sasl_tls机制,将生成的证书创建为Secret传入Chart的existingSecrets参数后,用KafkaJS连接Kafka broker时设置ssl: true,出现以下错误:
KafkaJSConnectionError: Connection error: unable to verify the first certificate
详细操作步骤
- 开启Kafka Chart外部访问,配置端口9094:
externalAccess.enabled: true externalAccess.autoDiscovery.enabled: true externalAccess.service.type: LoadBalancer externalAccess.service.ports.external: 9094 externalAccess.service.domain: "" - 将LoadBalancer的IP绑定到域名
xyz.com - 为
xyz.com通过Let's Encrypt签发证书,生成tls.crt和tls.key文件 - 重命名证书文件并创建Secret:
kubectl create secret generic kafka-tls-0 --from-file=tls.crt=kafka-0.tls.crt --from-file=tls.key=kafka-0.tls.key - 修改Chart的TLS配置:
tls.type: pem tls.pemChainIncluded: true tls.existingSecrets: ["kafka-tls-0"] - 应用配置启动broker
- 在KafkaJS客户端中,尝试用
ip:9094或xyz.com:9094作为broker地址,设置ssl: true连接
用户问题
- 上述流程是否正确?有没有方向错误?
- 报错原因是什么?是不是证书链配置错误?
- 有没有其他Helm Chart可以实现该需求?
后续问题
- 若配置成功,如何确保证书自动续期?是系统自动管理还是需要维护脚本?
问题解答
- 流程正确性与方向问题
整体方向没问题,但存在几个细节疏漏:
- 绑定域名时,必须确保
xyz.com的DNS记录指向LoadBalancer的公网IP,且能正常解析 - 创建Secret时,Bitnami Kafka的PEM格式证书要求
tls.crt必须包含完整证书链(包括Let's Encrypt的中间证书),仅传入域名叶子证书会导致证书链不完整 - 客户端连接必须使用
xyz.com:9094,不能用IP:Let's Encrypt证书绑定域名,用IP连接会触发证书域名不匹配,同时引发证书链验证失败
报错原因
大概率是证书链不完整:Let's Encrypt签发的证书需要搭配中间证书才能被客户端信任。如果tls.crt仅包含域名的叶子证书,未包含Let's Encrypt的中间证书(如R3证书),客户端无法完成证书链验证,就会抛出unable to verify the first certificate错误。
另外,若客户端用IP而非域名连接,也会触发该错误(证书域名与连接地址不匹配,客户端拒绝信任)。替代Helm Chart
可考虑以下选项:
- Strimzi Kafka Operator:原生支持Kubernetes上的Kafka部署,内置cert-manager与Let's Encrypt集成,证书管理、SASL_TLS配置更自动化,无需手动处理Secret和证书链
- Confluent Platform Helm Charts:官方提供的Chart,对TLS、SASL的配置更精细化,适合企业级场景,但配置复杂度稍高
后续问题解答
若使用cert-manager签发Let's Encrypt证书,证书自动续期由cert-manager自动管理,无需额外脚本:
- cert-manager会定期检查证书有效期(默认过期前30天),自动发起续期请求
- 续期成功后,对应Secret会被自动更新
- Bitnami Kafka Chart会监听Secret变化,自动重载证书(部分版本可能需要重启broker,建议验证Chart的证书热重载支持)
内容的提问来源于stack exchange,提问作者Azman Amin
相关产品推荐
相关产品推荐

