0

我正在尝试将证书添加到 Python 请求包所需的 Dockerfile 中:

FROM python:3.9-slim-buster
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PYTHONPATH="$PYTHONPATH:/app"
WORKDIR /app
COPY ./app .
COPY ./certs/*.crt /usr/local/share/ca-certificates/
RUN update-ca-certificates
RUN pip3 install requests
CMD ["python3", "main.py"]

使用上面的 Dockerfile,我得到以下错误:

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain

根据我的测试,那是因为requests正在使用certifi并且只在内部查看/usr/local/lib/python3.9/site-packages/certifi/cacert.pem。如果我在里面添加我的证书cacert.pem,一切都会按预期工作并且错误消失了。

处理这个问题的pythonic方法是什么?理想情况下,我宁愿将证书插入目录,而不是修改文件。有没有办法“强制”Pythonrequests在里面/etc/ssl/certs查找证书以及证书cacert.pem文件?如果我列出/etc/ssl/certs目录内容,它包含我的 .pem 证书。

运行apt-get update不会更新ca-certificates,我已经在使用最新版本。当我执行update-ca-certificates时,检测到新证书:

STEP 10/11: RUN update-ca-certificates
Updating certificates in /etc/ssl/certs...
2 added, 0 removed; done.

谢谢您的帮助。

4

1 回答 1

1

我发现唯一合理的解决方案是:

from requests import post
from requests.exceptions import HTTPError, RequestException, SSLError

try:
    result = post(url=url, data=dumps(data), headers=headers, verify='/etc/ssl/certs')
except (HTTPError, RequestException, SSLError) as e:
    raise

设置verify=/etc/ssl/certs将看到自签名证书。

于 2022-01-25T21:48:02.620 回答