Python 3.x 具有自定义SSL证书的Docker上的Exchangelib
我已经构建了一个依赖于库的Fastapi web应用程序。我在一个内部网络中工作,其中一个windows IIS以根用户身份签署了邮件服务器的证书。证书链仅由两个级别组成:邮件服务器证书和根服务器证书 在ubuntu 20.04服务器上,我在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
/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证书的路径不变)。