升级至python 3.7后无法建立与Kafka的SSL连接

时间:2019-11-19 23:49:04

标签: python-3.x apache-kafka openssl confluent-kafka

使用Python 3.7.3时,我使用Python 3.6.7中的SSL连接成功连接到Kafka的代码失败,错误消息为SSL: WRONG_VERSION_NUMBER。我不希望在Python 3.7中运行在Python 3.6中的代码会失败。我想知道如何解决此错误并使用Python 3.7.3通过SSL连接到Kafka。

我尝试了几种方法进行故障排除:

  • 使用其他软件包连接到Kafka(与faust的连接会产生基本上相同的错误)
  • 使用其他密码套件(并验证设置为不兼容会导致错误,从而导致没有通用的密码套件)
  • 使用其他版本的Kafka容器(带有python 3.7的Confluent的Kafka 5.0.0容器返回no cipher suites in common错误,而5.1.3不会更改该错误)
  • 使用其他协议(仅启用TLS1.1或1.2不会更改错误,在Kafka上启用1.1,在python上启用1.2,反之亦然会导致名称解析失败)
  • 使用其他版本的openssl(此错误最初是在openssl 1.1.1c中发现的,并在1.1.1a上复制;对于当前的复制,两个容器都使用1.1.1b)

重现此问题可能相当复杂。它需要同时运行Kafka和Zookeeper以及两个不同的可比较版本的Python,以及每个版本所需的完整SSL凭证。值得庆幸的是,Docker可以为我们完成很多工作。我创建了一个Github Repo,其中包含仅使用Docker桌面即可重现该错误所需的最少文件集:

https://github.com/r-archer37/python-kafka-mre

重现该错误的确切步骤在README中。简短的版本是有两个docker-compose文件,唯一的区别是Jupyter提供的基于python的docker镜像的版本。每个脚本都运行一个简单的脚本,该脚本将安装pykafka,然后尝试连接到Kafka容器。带有python 3.6的容器将成功连接到Kafka(控制台输出看起来像DEBUG:pykafka.connection:Successfully connected to b'kafka':9092),带有python 3.7的容器将无法连接到Kafka(控制台输出看起来像INFO:pykafka.connection:Attempt 0: failed to connect to kafka:9092 ... INFO:pykafka.connection:[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1056))。

欢迎修复和提出尝试建议!

编辑:解决方案似乎是使用其他组织而不是Confluent的kafka docker映像。

2 个答案:

答案 0 :(得分:1)

这很奇怪。根据我的调查,我怀疑python升级带来了Kafka的问题,您可能想向他们提交错误报告。我能够使用python容器3.6和3.7的失败来重现它。

我捕获了两者的wireshark痕迹。使用3.6,客户端发送Client Hello tls消息,服务器使用有效的Server Hello进行响应,从而完成了握手。使用3.7,当客户端发送Client Hello消息时,服务器将以重复的0x00进行响应。 0x00 0x00不是有效的TLS版本,因此{sl.openssl的WRONG_VERSION_NUMBER报告。

当尝试使用来自两个容器的openssl客户端创建到kafka的TLS连接时,服务器还仅通过一系列0x00字节来响应客户端握手。 我使用的Openssl客户端命令:openssl s_client -connect kafka:9092 -cert mre.pem -CAfile mre.pem -key mre.pem -state -debug -tls1_2

答案 1 :(得分:0)

这可以通过使用 keytool -keyalg RSA 生成证书密钥来解决