Сельдерей — [SSL: CERTIFICATE_VERIFY_FAILED] не удалось проверить сертификат

#ssl #heroku #ssl-certificate #celery #django-celery

Вопрос:

У меня есть следующая конфигурация сельдерея для моего проекта Django, размещенного на heroku/git —

 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
                    }
                    )
 

Однако, когда я запускаю сельдерей, я получаю следующее сообщение об ошибке в журнале.

 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 с Сельдереем для защиты моего проекта в будущем?

Комментарии:

1. Обычно для устранения неполадок с сертификатами я начинаю с попытки подключиться с помощью openssl и внутреннего хранилища ЦС, чтобы убедиться, что у него есть необходимые сертификаты. Я начинаю с openssl s_client -connect <host>:<port> , и если это возвращает 0 (ок), то остается выяснить, почему библиотеки в фреймворке не имеют сертификатов CA. Если он не возвращает 0, то сертификат необходимо добавить в центр сертификации.

2. Вы не можете добавить ssl-сертификаты в свой проект на heroku?

Ответ №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()