Python芹菜通过ssl连接



我一直在尝试通过芹菜5.0.5连接到一个RabbitMQ(它是从AWS Messaging Service创建的,如果它重要的话)实例。连接链路起始地址为amqps://user:password@..../。在运行python脚本时,我收到以下错误:

consumer: Cannot connect to amqps://sessionstackadmin:**@b-0482d011-0cca-40bd-968e-c19d6c85e2a9.mq.eu-central-1.amazonaws.com:5671//: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

我从一个docker容器与python 3.6.12运行脚本。docker容器可以访问端点(至少可以telnet到它)。我有一种感觉,python进程不尊重发行版证书链,它只是验证证书失败。

我解决了!芹菜使用的是Kombu,而Kombu使用的是py-amqp,碰巧从1月19日开始的最新版本5.0.3被破坏了。

我的GH票https://github.com/celery/py-amqp/issues/349

解决方案:在项目需求中添加amqp==5.0.2作为硬依赖项。

修复:git+git://github.com/celery/py-amqp.git@0b8a832d32179d33152d886acd6f081f25ea4bf2

我离开了"修复"的工作方法。这一点。由于某些原因,kombu库在尝试处理ssl连接时不尊重您的发行版附带的默认CA证书。这基本上是由https://docs.python.org/3/library/ssl.html#ssl.create_default_context处理的,该库不使用https://docs.python.org/3/library/ssl.html#ssl.create_default_context。遗憾的是,它不允许传入自定义SSLContext,而只允许传入一组稍后将传递到上下文的选项。其中一个选项是broker_use_ssl。通过将其设置为{'ca_certs': '/etc/ssl/certs/ca-certificates.crt'},它将尊重来自发行版的CA证书(请记住,我使用的是基于ubuntu/debian的镜像,CA证书配置文件驻留在那里,如果您使用其他发行版,请检查CA证书的正确位置)。

最新更新