使用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。
我尝试了几种方法进行故障排除:
faust
的连接会产生基本上相同的错误)no cipher suites in common
错误,而5.1.3不会更改该错误)重现此问题可能相当复杂。它需要同时运行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映像。
答案 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
生成证书密钥来解决