【发布时间】:2022-04-17 07:42:10
【问题描述】:
我在 Python 3.6.7 中通过 SSL 连接成功连接到 Kafka 的代码在使用 Python 3.7.3 时失败,并显示错误消息 SSL: WRONG_VERSION_NUMBER。我不希望在 Python 3.7 中运行的代码在 Python 3.7 中失败。我想知道如何解决此错误并使用 Python 3.7.3 通过 SSL 连接到 Kafka。
我尝试了几件事来解决问题:
- 使用不同的包连接Kafka(与
faust连接产生基本相同的错误) - 使用不同的密码套件(并验证设置它们不兼容会将错误更改为没有共同的密码套件)
- 使用不同版本的Kafka容器(Confluent的Kafka 5.0.0容器用python 3.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 存储库,其中包含仅使用 Docker 桌面重现错误所需的最少文件集:
https://github.com/r-archer37/python-kafka-mre
重现错误的确切步骤在自述文件中。简短的版本是有两个 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))。
欢迎提供修复和尝试的建议!
编辑:解决方案似乎是使用不同组织的 kafka docker 映像,而不是 Confluent。
【问题讨论】:
标签: python-3.x apache-kafka openssl confluent-platform