【问题标题】:Can't establish SSL connection to Kafka after upgrading to python 3.7升级到 python 3.7 后无法与 Kafka 建立 SSL 连接
【发布时间】: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


    【解决方案1】:

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

    我捕获了两者的wireshark痕迹。在 3.6 中,客户端发送Client Hello tls 消息,服务器以有效的Server Hello 响应,完成握手。在 3.7 中,当客户端发送 Client Hello 消息时,服务器会重复使用 0x00 响应。 0x00 0x00 不是有效的 TLS 版本,因此 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

    【讨论】:

    • 根据有关不良响应的信息,我尝试连接到 Confluent 未发布的 kafka 容器(我发现在本地测试/复制要困难得多)。我可以连接到其他图像(例如,Wurstmeister),所以我认为这是 Kafka 方面的一个问题,特别是 Confluent 的图像。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果你仍然有这个问题,你可以使用这个:

      !允许使用不安全的密码!

      ctx = ssl.SSLContext(<protocol>)
      ctx.set_ciphers(‘ALL:@SECLEVEL=0’)
      

      并将ctx 作为ssl_context 参数传递给KafkaConsumer/KafkaProducer 构造函数

      为我正常工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多