Docker 上的 Exchangelib 具有自定义 SSL 证书

Exchangelib on Docker with custom SSL Certificates

我构建了一个依赖库 exchangelib 的 Fastapi 网络应用程序。我在内部网络中工作,其中 windows IIS 以 root 身份签署了邮件服务器的证书。证书链只有两层:邮件服务器证书和根服务器证书。

在 ubuntu 20.04 服务器上,我在 /usr/local/share/ca-certificates 下添加了两个证书并通过 sudo update-ca-certificates 更新了列表。到这里为止都没有问题。

当我使用 docker 构建和 运行 容器时,我收到错误消息

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

这是 Dockerfile

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"]

我已经更改了证书权限,因为我认为它会有所帮助,但没有结果。此外,我 运行 每个新添加的证书。但是当 RUN update-ca-certificates 命令为 运行.

时,证书被添加为 1 added 打印在终端上

我不确定这是 docker 还是图书馆的问题。相同的证书在裸机服务器上有效,但在 docker.

上无效

有人可以帮忙吗? 谢谢

我没看懂

好的,在花了一个多星期检查我的证书以及 docker 发生了什么之后,@Erik Cederstrand 启发了我,建议检查 requests 的证书路径。

原来确实设置到了不同的位置,不知道为什么。因此,可以肯定的是,我更改了 REQUESTS_CA_BUNDLESSL_CERT_FILE 环境变量以指向我的 ca 证书文件(这是 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