python confluent kafka客户端-无法使用SSL访问GKE上的Kafka

Posted

技术标签:

【中文标题】python confluent kafka客户端-无法使用SSL访问GKE上的Kafka【英文标题】:python confluent kafka client - unable to access Kafka on GKE using SSL 【发布时间】:2022-01-09 09:01:49 【问题描述】:

我有一个简单的 python Kafka 生产者,我正在尝试访问 GKE 上的 Strimzi Kafka 集群,但出现以下错误:

cimpl.KafkaException: KafkaErrorcode=_INVALID_ARG,val=-186,str="Failed to create producer: ssl.key.location failed: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch"

这里是 Kafka 生产者代码:

from confluent_kafka import Producer

kafkaBrokers='<host>:<port>'
caRootLocation='/Users/karanalang/Documents/Technology/strimzi/gcp_certs_nov28/pem-user2/cacerts.pem'
certLocation='/Users/karanalang/Documents/Technology/strimzi/gcp_certs_nov28/pem-user2/cert.pem'
keyLocation='/Users/karanalang/Documents/Technology/strimzi/gcp_certs_nov28/pem-user2/key.pem'
password='<password>'

conf = 'bootstrap.servers': kafkaBrokers,
        'security.protocol': 'SSL',
        'ssl.ca.location':caRootLocation,
        'ssl.certificate.location': certLocation,
        'ssl.key.location':keyLocation,
        'ssl.key.password' : password

topic = 'my-topic1'

producer = Producer(conf)

for n in range(100):
        producer.produce(topic, key=str(n), value="val -> "+str(n))

producer.flush()

要获取 pem 文件(从秘密 - PKCS 文件),这里是使用的命令

kubectl get secret my-cluster-lb-ssl-certs-cluster-ca-cert -n kafka -o jsonpath='.data.ca\.p12' | base64 -d > ca.p12 
kubectl get secret my-cluster-lb-ssl-certs-cluster-ca-cert -n kafka -o jsonpath='.data.ca\.password' | base64 -d > ca.password


kubectl get secret my-bridge1 -n kafka -o jsonpath='.data.user\.p12' | base64 -d > user2.p12
kubectl get secret my-bridge1 -n kafka -o jsonpath='.data.user\.password' | base64 -d > user2.password

- to get the user private key i.e. key.pem
openssl pkcs12 -in user2.p12 -nodes -nocerts -out key.pem -passin pass:<passwd>

# CARoot - extract cacerts.cer
openssl pkcs12 -in ca.p12 -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cacerts.cer
# convert to pem format
openssl x509 -in cacerts.cer -out cacerts.pem

# get the ca.crt from the secret
kubectl get secret my-cluster-lb-ssl-certs-cluster-ca-cert -n kafka -o jsonpath='.data.ca\.crt' | base64 -d > ca.crt
# convert to pem
openssl x509 -in ca.crt -out cert.pem

任何想法如何解决这个问题?

请注意 - 我可以在 SSL 上使用命令行 Kafka 生产者/消费者访问 Kafka 集群

【问题讨论】:

您是否尝试过使用秘密文件中的.crt / .key 文件,而不是从PKCS12 文件中转换它们?如果在转换过程中发生任何问题,可能有助于避免。 嗨@Jakub-使用 .key 文件(来自 my-bridge1 机密,如 -ssl.key.password)给出相同的错误,机密 my-cluster-lb-ssl-certs-cluster- ca-cert - 有 ca.p12 和 ca.crt。 ssl.certificate.location 的值应该设置为多少? ca.crt - 是 CA 根,据我了解,应该设置为 ssl.ca.location ? 我认为ca.crt 应该是ssl.certificate.location。但为了记录,我从未使用过 Python 客户端,所以我只是猜测,仅此而已。 好的,不知何故 ca.crt 和 user.key 不匹配,我从用户机密和集群机密中获取了 ca.cart,但结果相同..关于任何想法这个? 【参考方案1】:

这是固定的,请参阅下面的预期配置:

'ssl.ca.location' -> CARoot(认证机构,用于签署所有用户证书) 'ssl.certificate.location' -> 用户证书(Kubernetes 用于向 API 服务器进行身份验证) 'ssl.key.location' -> 用户私钥

上述错误是由于使用了错误的用户证书,它应该与用户私钥匹配

【讨论】:

以上是关于python confluent kafka客户端-无法使用SSL访问GKE上的Kafka的主要内容,如果未能解决你的问题,请参考以下文章

如何在kafka-python和confluent-kafka之间做出选择

confluent-kafka-go源码分析

防止 Confluent Kafka 在生产时丢失消息

如何使用Python以编程方式在Apache Kafka中创建主题

使用confluent本地安装和使用kafka

Kafka快速入门——Confluent Kafka简介