#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()