Exchangelib на Docker с пользовательскими SSL-сертификатами

Я создал веб-приложение Fastapi, основанное на библиотеке exchangelib. Я работаю во внутренней сети, где Windows IIS подписал корневой сертификат почтового сервера. Цепочка сертификатов состоит всего из 2 уровней: сертификат почтового сервера и сертификат корневого сервера.

На сервере Ubuntu 20.04 я добавил два сертификата под /usr/local/share/ca-certificates и обновил список через sudo update-ca-certificates. Пока здесь работает без проблем.

Когда я использую докер для сборки и запуска контейнера, я получаю сообщение об ошибке

exchangelib.errors.TransportError: HTTPSConnectionPool(host='**********', port=443): Max retries exceeded with url: /EWS/Exchange.asmx (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1124)')))

Вот докерфайл

FROM python:3.8.6-slim

WORKDIR .

COPY . .

RUN pip install -r requirements.txt

EXPOSE 8000

COPY ./ssl/CA.crt /usr/local/share/ca-certificates/CA.crt
RUN chmod 644 /usr/local/share/ca-certificates/CA.crt
RUN update-ca-certificates

COPY ./ssl/server.crt /usr/local/share/ca-certificates/server.crt
RUN chmod 644 /usr/local/share/ca-certificates/server.crt
RUN update-ca-certificates

CMD [ "uvicorn", "app:app", "--host", "0.0.0.0"]

Я изменил разрешения сертификата, так как думал, что это поможет, но безрезультатно. Кроме того, я запускаю каждый новый добавленный сертификат. Но сертификаты добавляются, когда 1 added печатается на терминале при запуске команды RUN update-ca-certificates.

Я не уверен, что это проблема с докером или с библиотекой. Те же сертификаты работают на чистом сервере, но не на докере.

Кто-нибудь может помочь? Спасибо

я не понимаю


person lsabi    schedule 03.12.2020    source источник
comment
Вероятно, вам нужно указать запросы на использование скопированных сертификатов. См. предложения по адресу stackoverflow.com/questions/42982143/   -  person Erik Cederstrand    schedule 04.12.2020
comment
Кажется, это корень проблемы. Хотя даже попытка установить переменную окружения в dockerfile вроде бы не работает (путь к сертификатам питона не меняется).   -  person lsabi    schedule 04.12.2020


Ответы (1)


Хорошо, после более чем недели, потраченной на проверку моих сертификатов и того, что происходит с докером, @Erik Cederstrand просветил меня, предложив проверить путь сертификата requests.

Оказалось, что действительно он был установлен в другом месте, не знаю почему. Итак, чтобы быть уверенным, я изменил обе переменные среды REQUESTS_CA_BUNDLE и SSL_CERT_FILE, чтобы они указывали на мой файл сертификатов ЦС (который является системным в Ubuntu/Debian).

Во всяком случае, мой окончательный Dockerfile выглядит следующим образом

FROM python:3.8-slim

WORKDIR .

COPY . .

ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

COPY ./ssl/* /usr/local/share/ca-certificates/

RUN update-ca-certificates

RUN pip install -r requirements.txt

EXPOSE 8000

CMD [ "uvicorn", "app:app", "--host", "0.0.0.0"]

Большое спасибо @Erik Cederstrand

person lsabi    schedule 04.12.2020