Windows下Docker容器安装SSL CA证书及Python HTTPS请求验证问题
问题原因分析
报错核心是公司HTTPS代理的中间人证书未被容器内的CA信任:
- Windows宿主机运行正常的原因:公司代理的根证书已经预安装在Windows系统证书库中,Windows版的certifi会自动读取系统证书库完成验证
- Docker容器中验证失败的原因:
- 公网CA包
ca-certificates不包含你公司代理的私有根证书,所以仅安装系统CA的方案无效 - Linux环境下的certifi默认仅使用自带的公网CA列表,不会自动读取系统CA存储,即使你把证书装到系统CA里,Python默认也不会调用
- 公网CA包
解决方案
步骤1:导出公司代理的根证书
在Windows 10宿主机上操作:
- 用Edge/Chrome浏览器访问代码中的企鹅图片链接
- 点击地址栏左侧的🔒图标 → 「连接是安全的」→ 「证书」
- 切换到「证书路径」标签页,选中最顶层的根证书 → 点击「查看证书」
- 切换到「详细信息」标签页 → 点击「复制到文件」
- 导出格式选择「Base64 编码的 X.509 (.CER)」,保存为
company_root.crt,存到Dockerfile同级目录
步骤2:修改Dockerfile配置
调整后的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" # 配置Python及相关库使用系统CA证书 ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt # 安装CA证书工具 RUN apt-get update && \ apt-get install ca-certificates -y && \ apt-get clean # 复制公司根证书到系统CA目录 COPY company_root.crt /usr/local/share/ca-certificates/company_root.crt RUN chmod 644 /usr/local/share/ca-certificates/company_root.crt && \ update-ca-certificates RUN pip install --upgrade certifi COPY ./download_penguin.py ./download_penguin.py CMD [ "python", "download_penguin.py" ]
可选:直接修改Python代码适配
如果不想修改容器配置,也可以直接把导出的company_root.crt复制到容器内,修改代码里的上下文指定即可:
https_handler = urllib.request.HTTPSHandler(context=ssl.create_default_context(cafile="/path/to/company_root.crt"))
内容的提问来源于stack exchange,提问作者Justin P.
相关产品推荐
相关产品推荐

