我的代码在python3.6.7中使用ssl连接成功地连接到kafka,但在使用python3.7.3时失败,并显示错误消息 SSL: WRONG_VERSION_NUMBER
. 我不希望在python3.6中工作的代码在python3.7中失败。我想知道如何解决这个错误,并连接到Kafka通过ssl与Python3.7.3。
我尝试了几种方法来排除故障:
使用不同的包连接到kafka(与 faust
产生基本相同的错误)
使用不同的密码套件(并验证不兼容地设置它们是否会将错误更改为“无公用密码套件”)
使用不同版本的kafka容器(confluent的kafka 5.0.0容器与Python3.7一起返回 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 desktop复制错误所需的最少文件集:
https://github.com/r-archer37/python-kafka-mre
重现错误的确切步骤在自述文件中。简短的版本是有两个docker compose文件,其中唯一的区别是jupyter提供的基于python的docker映像的版本。每个都运行一个简单的脚本来安装 pykafka
然后尝试连接到Kafka容器。带有python3.6的容器将成功连接到kafka(控制台输出如下所示) DEBUG:pykafka.connection:Successfully connected to b'kafka':9092
)带有python3.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)
).
修复和建议的东西尝试,都是欢迎的!
编辑:解决方案似乎是由不同的组织使用Kafka Docker 形象,而不是合流。
1条答案
按热度按时间lg40wkob1#
这很奇怪。根据我的调查,我怀疑python升级暴露了kafka的一个问题,你可能想向他们提交一份bug报告。我能够用python容器3.6重现它,用python容器3.7重现它的失败。
我捕捉到了这两种鲨鱼的踪迹。在3.6中,客户机发送
Client Hello
tls消息,服务器用有效的Server Hello
,完成握手。在3.7中,当客户端发送Client Hello
消息,服务器响应0x00
重复的。0x00 0x00
不是有效的tls版本,因此WRONG_VERSION_NUMBER
openssl报告。当尝试从任一容器使用openssl客户机创建到kafka的tls连接时,服务器也仅通过一系列响应来响应客户机握手
0x00
字节。我使用的openssl客户端命令:openssl s_client -connect kafka:9092 -cert mre.pem -CAfile mre.pem -key mre.pem -state -debug -tls1_2