【问题标题】:Celery - [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failedCelery - [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败
【发布时间】:2021-09-28 15:28:00
【问题描述】:

我在 heroku/git 上托管的 Django 项目有以下 celery 配置 -

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'App.settings')


app = Celery('App')

app.conf.timezone = 'Europe/London'

app.config_from_object('django.conf:settings')
app.conf.update(BROKER_URL=str(os.getenv('REDIS_URL')),
                CELERY_RESULT_BACKEND=str(os.getenv('REDIS_URL')),
                broker_use_ssl = {
                        'ssl_cert_reqs': ssl.CERT_REQUIRED
                    },
                    redis_backend_use_ssl = {
                        'ssl_cert_reqs': ssl.CERT_REQUIRED
                    }
                    )

但是,当我运行 celery 时,我收到以下日志错误消息。

ERROR/MainProcess] consumer: Cannot connect to rediss://****************//: Error 1 connecting to *************. [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed 

我可以通过设置 ssl_cert_reqs': ssl.CERT_NONE 来解决这个问题,但是我会收到以下警告 -

Setting ssl_cert_reqs=CERT_NONE when connecting to redis means that celery will not valdate the identity of the redis broker when connecting. This leaves you vulnerable to man in the middle attacks.

有谁知道我可以如何解决这个问题,以使用 SSL 和 Celery 来保护我的项目向前发展?

【问题讨论】:

  • 通常,为了解决证书问题,我首先尝试使用 openssl 和内部 CA 存储进行连接,以验证它是否具有所需的证书。我从openssl s_client -connect <host>:<port> 开始,如果返回 0(ok),那么就要弄清楚为什么框架中的库没有 CA 证书。如果不返回 0,则需要将证书添加到 CA。
  • 您无法在 heroku 上的项目中添加 ssl 证书?

标签: ssl heroku ssl-certificate celery django-celery


【解决方案1】:

您是否尝试过更新您的 SSL 证书?对于 Unix,在你的 IDE 中运行类似这样的代码应该可以做到(在 GitHub 上找到)。

import os
import os.path
import ssl
import stat
import subprocess
import sys

STAT_0o775 = ( stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
             | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
             | stat.S_IROTH |                stat.S_IXOTH )


def main():
    openssl_dir, openssl_cafile = os.path.split(
        ssl.get_default_verify_paths().openssl_cafile)

    print(" -- pip install --upgrade certifi")
    subprocess.check_call([sys.executable,
        "-E", "-s", "-m", "pip", "install", "--upgrade", "certifi"])

    import certifi

    # change working directory to the default SSL directory
    os.chdir(openssl_dir)
    relpath_to_certifi_cafile = os.path.relpath(certifi.where())
    print(" -- removing any existing file or link")
    try:
        os.remove(openssl_cafile)
    except FileNotFoundError:
        pass
    print(" -- creating symlink to certifi certificate bundle")
    os.symlink(relpath_to_certifi_cafile, openssl_cafile)
    print(" -- setting permissions")
    os.chmod(openssl_cafile, STAT_0o775)
    print(" -- update complete")

if __name__ == '__main__':
    main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 2016-11-26
    • 1970-01-01
    • 2018-07-29
    • 2017-06-01
    • 2017-02-05
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多