Производитель kafka-python — сбой соединения SSL — только Trustore

Я пытаюсь публиковать сообщения через python в тему кафки и получаю сообщение об ошибке. Я могу подключиться и опубликовать через 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)

person Justin Bailey    schedule 07.06.2019    source источник
comment
Вы можете создавать сообщения с производителем консоли?   -  person Giorgos Myrianthous    schedule 07.06.2019
comment
Да. Также через KafkaTool.   -  person Justin Bailey    schedule 07.06.2019


Ответы (2)


Перейдите по этой ссылке.

Вы должны добавить SSL-сертификат в хранилище ключей JVM практически для любой программы, работающей под управлением Java.

person ThatCampbellKid    schedule 07.06.2019
comment
Спасибо за ссылку. Я копался в этом. Имейте в виду, что, используя ту же документацию, я могу подключиться только к файлу хранилища доверенных сертификатов через производителя консоли, поставляемый с дистрибутивом kafka. Эти серверы не требуют сертификации на стороне клиента, поэтому не нужно включать хранилище ключей. Я застрял, пытаясь продублировать соединение только для доверия с библиотекой python. - person Justin Bailey; 07.06.2019

Я обнаружил, что по умолчанию библиотека python-kafka устанавливает для свойства ssl_cafile значение None. Установка ОС по умолчанию (/etc/pki/tls/cert.pem в Linux) позволила мне подключиться к брокерам kafka.

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

person Ameya Panse    schedule 06.10.2020
comment
Спасибо за вклад в наше сообщество! Пожалуйста, сосредоточьтесь на вопросе и улучшите свой ответ. Вы можете добавить больше форматирования и деталей, которые могут помочь в решении проблемы. - person Fedor Soldatkin; 06.10.2020