如何通过pyjks解析.jks证书配置Python Kafka消费者SSL参数
实现方案
KafkaConsumer的ssl_cafile、ssl_certfile、ssl_keyfile参数默认接收PEM格式的证书文件路径,而pyjks加载出来的是二进制证书对象,你需要先把JKS中的内容转码为PEM格式,再完成Kafka配置。
1. 依赖安装
先安装所需的依赖库:
pip install pyjks kafka-python pyopenssl
2. 完整代码实现
import jks import OpenSSL from kafka import KafkaConsumer import ssl # 自定义配置项 JKS_PATH = "你的.jks文件路径" JKS_STORE_PASS = "JKS密钥库密码".encode("utf-8") PRIVATE_KEY_ALIAS = "私钥在JKS中的别名" PRIVATE_KEY_PASS = "私钥专属密码".encode("utf-8") KAFKA_TOPIC = "要消费的Topic名称" KAFKA_BOOTSTRAP = ["Kafka服务地址:端口"] # 加载JKS密钥库 ks = jks.KeyStore.load(JKS_PATH, JKS_STORE_PASS) # 提取CA根证书转PEM格式 ca_pem_list = [] for alias, cert in ks.certs.items(): x509_cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_ASN1, cert.cert) ca_pem = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, x509_cert) ca_pem_list.append(ca_pem) ca_pem_content = b"\n".join(ca_pem_list) # 提取客户端证书、私钥转PEM格式 pk_entry = ks.private_keys[PRIVATE_KEY_ALIAS] if not pk_entry.is_decrypted(): pk_entry.decrypt(PRIVATE_KEY_PASS) # 客户端证书转码 client_cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_ASN1, pk_entry.cert_chain[0][1]) client_cert_pem = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, client_cert) # 私钥转码 private_key = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_ASN1, pk_entry.pkey) private_key_pem = OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, private_key) # 构造SSL上下文(无需写入本地文件,直接使用内存内容) ssl_context = ssl.create_default_context() ssl_context.load_verify_locations(cadata=ca_pem_content.decode("utf-8")) ssl_context.load_cert_chain( certfile=None, keyfile=None, cert_data=client_cert_pem, key_data=private_key_pem ) # 初始化Kafka消费者 consumer = KafkaConsumer( KAFKA_TOPIC, bootstrap_servers=KAFKA_BOOTSTRAP, security_protocol="SSL", ssl_context=ssl_context )
注意事项
- 你示例代码中的
boostrap_servers拼写有误,正确拼写为bootstrap_servers - 不知道JKS中私钥别名的话,加载JKS后执行
print(list(ks.private_keys.keys()))即可查看所有私钥别名 - 如果JKS的私钥密码和密钥库密码一致,直接把
JKS_STORE_PASS传给私钥解密参数即可 - 如果Kafka服务端不需要客户端认证,可以省略客户端证书、私钥的配置,仅保留CA证书配置即可
如果你使用的Python版本低于3.10,
load_cert_chain不支持cert_data、key_data参数,把生成的三类PEM内容分别写入本地文件,再把文件路径传给ssl_cafile、ssl_certfile、ssl_keyfile参数即可。
内容的提问来源于stack exchange,提问作者korador
相关产品推荐
相关产品推荐

