【问题标题】:kafka-python producer - SSL connection failure - Trustore Onlykafka-python 生产者 - SSL 连接失败 - 仅限 Trustore
【发布时间】:2019-10-23 04:19:21
【问题描述】:

我正在尝试通过 python 将消息发布到 kafka 主题并收到错误消息。我可以通过 CLI 连接和发布。希望得到一些指导。我已经用谷歌搜索并阅读了文档。谢谢!!

成功的 CLI 命令:

 kafka-console-producer --broker-list 
 123.45.67.891:1234,123.45.67.892:1234,123.45.67.893:1234 -- 
 producer.config C:\Users\fake_user\Kafka\client-ssl.properties --topic FakeTopic

 Contents of client-ssl.properties:
   security.protocol = SSL
   ssl.truststore.location = C:/Users/fake_user/Kafka/kafka-truststore
   ssl.truststore.password = fakepass

代码:

from kafka import KafkaProducer

  producer = KafkaProducer(bootstrap_servers=['123.45.67.891:1234', '123.45.67.892:1234', '123.45.67.893:1234'],
                           security_protocol='SSL',
                           ssl_certfile=r'C:\Users\fake_user\Kafka\kafka-truststore',
                           ssl_password='fakepass')

  producer.send('FakeTopic', value='python_test', key='test')

结果错误:

Traceback (most recent call last):
  File "kafka_post_test.py", line 6, in <module>
    ssl_password='fakepass')
  File "C:\Users\fake_user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kafka\producer\kafka.py", line 381, in __init__
    **self.config)
  File "C:\Users\fake_user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kafka\client_async.py", line 239, in __init__
    self.config['api_version'] = self.check_version(timeout=check_timeout)
  File "C:\Users\fake_user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kafka\client_async.py", line 874, in check_version
    version = conn.check_version(timeout=remaining, strict=strict, topics=list(self.config['bootstrap_topics_filter']))
  File "C:\Users\fake_user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kafka\conn.py", line 1078, in check_version
    if not self.connect_blocking(timeout_at - time.time()):
  File "C:\Users\fake_user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kafka\conn.py", line 331, in connect_blocking
    self.connect()
  File "C:\Users\fake_user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kafka\conn.py", line 420, in connect
    if self._try_handshake():
  File "C:\Users\fake_user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kafka\conn.py", line 496, in _try_handshake
    self._sock.do_handshake()
  File "C:\Users\fake_user\AppData\Local\Programs\Python\Python37-32\lib\ssl.py", line 1117, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1051)

【问题讨论】:

  • 你能用控制台生产者生产消息吗?
  • 是的,我是。也通过 KafkaTool。

标签: python ssl apache-kafka kafka-python apache-kafka-security


【解决方案1】:

看看这个link.

对于几乎所有由 Java 运行的程序,您都必须将 SSL 证书添加到 JVM 密钥库中。

【讨论】:

  • 感谢您的链接。我深入研究了它。请知道,使用相同的文档,我只能通过 kafka 发行版提供的控制台生产者连接信任库文件。这些服务器不需要客户端认证,因此没有要包含的密钥库。我一直试图复制与 python 库的仅信任连接。
【解决方案2】:

我发现默认情况下,python-kafka 库将 ssl_cafile 属性设置为 None。将其设置为默认操作系统(Linux 上的 /etc/pki/tls/cert.pem)允许我连接到 kafka 代理。

https://kafka-python.readthedocs.io/en/master/_modules/kafka/producer/kafka.html#KafkaProducer.send

【讨论】:

  • 感谢您为我们的社区做出贡献!请专注于问题并改进您的答案。您可以添加更多格式和详细信息,这有助于解决问题。
猜你喜欢
  • 2014-04-09
  • 2021-08-10
  • 2016-06-11
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 2019-06-15
相关资源
最近更新 更多