Python 3.x 具有自定义SSL证书的Docker上的Exchangelib

Python 3.x 具有自定义SSL证书的Docker上的Exchangelib,python-3.x,ssl,dockerfile,ssl-certificate,exchangelib,Python 3.x,Ssl,Dockerfile,Ssl Certificate,Exchangelib,我已经构建了一个依赖于库的Fastapi web应用程序。我在一个内部网络中工作,其中一个windows IIS以根用户身份签署了邮件服务器的证书。证书链仅由两个级别组成:邮件服务器证书和根服务器证书 在ubuntu 20.04服务器上,我在/usr/local/share/ca certificates下添加了两个证书,并通过sudo update ca certificates更新了列表。直到这里,它的工作没有问题 当我使用docker构建和运行容器时,会收到错误消息 exchangelib

我已经构建了一个依赖于库的Fastapi web应用程序。我在一个内部网络中工作,其中一个windows IIS以根用户身份签署了邮件服务器的证书。证书链仅由两个级别组成:邮件服务器证书和根服务器证书

在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启发了我,建议检查
请求
的证书路径

事实证明,它确实被设置到了一个不同的位置,不知道为什么。因此,可以肯定的是,我更改了
请求\u CA\u BUNDLE
SSL\u CERT\u文件
环境变量以指向我的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

,您可能需要告诉请求使用复制的证书。请看下面的建议,这似乎是问题的根源。尽管即使尝试在dockerfile中设置环境变量也似乎不起作用(python证书的路径不变)。