Nginx, uwsgi и приложение flask в контейнере Docker, генерирующее [SSL: CERTIFICATE_VERIFY_FAILED]

Я создаю приложение, используя следующий стек:

  • Python 3.6 + Flask
  • uwsgi
  • Nginx

выполняется внутри контейнера Docker. Это приложение, в свою очередь, вызывает Jira API для сбора и обработки данных. Большая часть входящих в приложение работает нормально. Но когда приложение пытается вызвать Jira API, оно выдает следующую ошибку: [SSL: CERTIFICATE_VERIFY_FAILED]

Я считаю, что эта проблема возникает из-за наличия самоподписанного сертификата в цепочке (чего нельзя избежать). Я импортировал сертификаты в образ докера, и команда curl работала нормально (изначально curl также выдавал небезопасное предупреждение).

Кроме того, чтобы изолировать проблему, я выключил nginx и запустил приложение напрямую с помощью uwsgi (uwsgi --socket 0.0.0.0:8080 --protocol = http -w [модуль]: [приложение]) и увидел ту же ошибку в консоли uwsgi.

Означает ли это, что мне нужно импортировать сертификат SSL в uwsgi? Если да, то как именно это сделать. Я не собираюсь защищать свое приложение с помощью собственного сертификата или ключей. Эта программа работает, если я просто запускаю приложение flask без каких-либо uwsgi, nginx и докеров.

[редактировать] Добавление конфигурации Nginx

server {
    listen 8080;
    location / {
        try_files $uri @app;
    }
    location @app {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
    location /static {
        alias /app/static;
    }
    location = / {
        index /static/index.html;
    }
} 

uwsgi - напрямую вызывая его с помощью CLI для отладки

[Edit2] Итак, я предпринял еще несколько действий по устранению неполадок:

  1. Создал один простой скрипт, который просто вызывает URL-адрес Jira
  2. Запустите сценарий на моем локальном компьютере (Mac OS), используя python3 [имя сценария]. Это сработало нормально и напечатало 200 OK.
  3. Скопировал тот же файл в свой контейнер и запустил тот же код.
  4. Получил ту же проблему.
  5. Использовал тот же URL с CURL и получил ответ.

Кажется, что хотя curl работает нормально, сам python выдает ошибку SSL. Итак, СЕЙЧАС может возникнуть вопрос, как справиться с ошибкой SSL с помощью python !?

Вы монтируете свои ssl-ключи в докер-контейнер? У меня раньше была аналогичная проблема. Я монтировал неправильную папку letsencrypt.

Josef Korbel 20.04.2018 21:22

Также добавьте код. По крайней мере, конфиг nginx и uwsgi.

Josef Korbel 20.04.2018 21:24

@JosefKorbel Я копирую файлы PEM внутри контейнера, а затем импортирую их внутрь. Также эти команды есть в моем dockerfile. Поскольку я новичок в этом, я не верю, что использую какие-либо ключи, это просто сертификаты.

k_r 20.04.2018 21:29

Вы монтируете /etc/letsencrypt/live?

Josef Korbel 21.04.2018 01:19
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
4
723
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец-то я смог решить проблему. Проблема была связана с вызовом запрос, выполняемым кодом. По умолчанию для вызовов запрос verify установлено значение true. Кроме того, запрос использует встроенные сертификаты для проверки. В моем случае, поскольку я использовал настраиваемые сертификаты, запрос не смог проверить сайт Jira. Чтобы решить эту проблему, я создал переменную ENV в файле докеров и указал запрос на ссылку на каталог сертификатов моего изображения. Точная линия

ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/

Обратите внимание, что настраиваемые сертификаты все равно необходимо импортировать в образ докера во время сборки.

Другие вопросы по теме