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_BUNDLE
和 SSL_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
我构建了一个依赖库 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_BUNDLE
和 SSL_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