gpt4 book ai didi

python - 在 Windows 上为 docker 容器安装 SSL CA 证书

转载 作者:行者123 更新时间:2023-12-04 22:39:55 33 4
gpt4 key购买 nike

我正在尝试从 docker 容器中发出 https 请求。这是在我的 Windows 10 主机上运行良好的 python 代码:

import certifi
import ssl
import urllib.request


tmp_filename = "penguin.jpg"
pingu_link = "https://i.pinimg.com/originals/cc/3a/1a/cc3a1ae4beafdd5ac2293824f1fb0437.jpg"

print(certifi.where())
default = ssl.create_default_context()
https_handler = urllib.request.HTTPSHandler(context=ssl.create_default_context())
opener = urllib.request.build_opener(https_handler)
# add user agent headers to avoid 403 response
opener.addheaders = [
(
"User-agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0",
)]
urllib.request.install_opener(opener)
r = urllib.request.urlretrieve(pingu_link, tmp_filename)
如果我理解正确的话,certifi 带有自己的一组 CA 证书,这些证书包含在 .pem 文件中,您可以通过调用 certifi.where() 找到这些证书。 .但是,如果我将此文件转换为 .crt 并通过调用告诉请求使用它
https_handler = urllib.request.HTTPSHandler(context=ssl.create_default_context(cafile="cacert.crt"))
验证失败:ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1129)。如 this post解释说,certifi 还会自动从 Windows 证书商店导入证书文件。
现在,如果您想在 docker 容器中验证 SSL 证书,我有点困惑这意味着什么。似乎有两种选择:
  • 只需安装 ca-certificates包裹。它应该为大多数 CA 提供必要的公钥。
  • 安装您自己的(可能是自签名的)证书:将其复制到您的 docker 容器中,并通过调用 update-ca-certificates 将其告知 ca-certificates 包. (您也可以将它安装在 Windows 全局证书存储中,它应该可以根据 github 上的 this issue 与 docker 一起使用)

  • 不幸的是,第一种方法似乎对我不起作用。它会引发与上述相同的验证错误。更糟糕的是,由于我不知道在没有 docker 的情况下使用哪个 .crt 文件来验证证书,所以第二个选项也不可能。这是 Dockerfile:
    # start with a python env that already has urllib3 installed
    FROM company_harbor/base_py3_container

    ENV HTTP_PROXY="my_company_proxy"
    ENV HTTPS_PROXY="my_company_proxy"
    # install ca certificates
    RUN apt-get update && \
    apt-get install ca-certificates -y && \
    apt-get clean

    RUN pip install --upgrade certifi --trusted-host=pypi.org --trusted-host=files.pythonhosted.org
    # what I would do if I found the right .crt file
    # COPY cacert.crt /usr/share/ca-certificates/cacert.crt
    # RUN chmod 644 /usr/share/ca-certificates/cacert.crt
    RUN update-ca-certificates
    COPY ./download_penguin.py ./download_penguin.py

    CMD [ "python", "download_penguin.py" ]
    为了在 docker 中使用 python 验证 SSL 证书,您需要做什么?

    最佳答案

    结果公司代理可以在 Man-in-the-middle manner 中交换 SSL 证书.
    来自 apt-get install ca-certificates 的标准证书或者 python 的 certifi 包不会包含这些公司证书。此外,这不是专门与 Docker 相关的问题,而是“如何在 Linux 上安装根证书”的问题。更准确地说是 Debian,因为这是 Docker 容器默认运行的。
    这并不像预期的那么简单。以下是最终奏效的方法:

  • 使用公司证书在 .pem 开头的格式。
  • 重命名它们,使它们以 .crt 结尾。不要使用任何 openssl .pem 到 .crt 的转换。就我而言,我在网上找到的每个 .crt 文件都以某种方式编码,使得 Notepad++、Vim 等无法读取。另一方面,.pem 文件看起来不错。
  • 将重命名的证书复制到操作系统上正确的 ca-certificate 位置。
  • 通过 update-ca-certificates 安装证书.

  • 翻译成 Dockerfile,这是重要的部分:
    COPY root.pem /usr/local/share/ca-certificates/root.crt
    COPY proxy.pem /usr/local/share/ca-certificates/proxy.crt
    RUN update-ca-certificates

    关于python - 在 Windows 上为 docker 容器安装 SSL CA 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69164224/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com