如何将自定义 CA 根证书添加到 Windows 中 pip 使用的 CA 存储?

2025-02-27 09:08:00
admin
原创
30
摘要:问题描述:我刚刚从 python.org 安装了 Python3,但在使用 安装软件包时遇到了问题pip。根据设计,这里的网络上有一个中间人数据包检查设备,它通过使用自己的证书重新签署所有 SSL 连接来检查所有数据包(包括 SSL)。GPO 的一部分将自定义根证书推送到 Windows 密钥库中。使用 Ja...

问题描述:

我刚刚从 python.org 安装了 Python3,但在使用 安装软件包时遇到了问题pip。根据设计,这里的网络上有一个中间人数据包检查设备,它通过使用自己的证书重新签署所有 SSL 连接来检查所有数据包(包括 SSL)。GPO 的一部分将自定义根证书推送到 Windows 密钥库中。

使用 Java 时,如果我需要访问任何外部 https 站点,我需要手动更新 JVM 中的 cacerts 以信任自签名 CA 证书。

我如何为 python 实现这一点?现在,当我尝试使用 安装软件包时pip,可以理解的是,我得到了奇妙的[SSL: CERTIFICATE_VERIFY_FAILED]错误。

我意识到我可以使用--trusted-host参数忽略它们,但我不想对我尝试安装的每个包都这样做。

有没有办法更新 python 使用的 CA 证书存储?


解决方案 1:

自签名证书颁发机构pip/conda

在广泛记录了 Git 的类似问题之后(如何让 git 接受自签名证书?),我们再次处于公司防火墙后面,代理为我们提供了MitM“攻击”,我们应该信任它,并且:

切勿禁用所有 SSL 验证!

这会造成不良的安全文化。不要成为那样的人。

更新至 2022 Python 3.10

可以实验性地使用该系统truststore。https
://pip.pypa.io/en/latest/user_guide/#using-system-trust-stores-for-verifying-https

# Requires Python 3.10 or later
python --version
Python 3.10.4

# Install the 'truststore' package from PyPI
python -m pip install truststore


# Use '--use-feature=truststore' flag to enable
python -m pip install SomePackage --use-feature=truststore

tl;dr:配置您自己的信任存储 CA 包

pip config set global.cert path/to/ca-bundle.crt
pip config list
conda config --set ssl_verify path/to/ca-bundle.crt
conda config --show ssl_verify

# Bonus while we are here...
git config --global http.sslVerify true
git config --global http.sslCAInfo path/to/ca-bundle.crt

但是我们能得到什么呢ca-bundle.crt


获取最新的 CA 包

cURL 发布了与 Mozilla Firefox 捆绑在一起的证书颁发机构摘录

https://curl.haxx.se/docs/caextract.html

  • 直接下载

  • SHA256

我建议您在文本编辑器中打开此cacert.pem文件,因为我们需要将自签名 CA 添加到此文件中。

证书是符合 X.509 标准的文档,但可以通过几种方式将其编码到磁盘。下面的文章值得一读,但简短的版本是我们正在处理 base64 编码,在文件扩展名中通常称为 PEM。您将看到它的格式为:

----BEGIN CERTIFICATE----
....
base64 encoded binary data
....
----END CERTIFICATE----

https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them


获取自签名证书

以下是如何获取自签名证书的一些选项:

  • 通过 OpenSSL CLI

  • 通过浏览器

  • 通过 Python 脚本

通过 OpenSSL CLI 获取自签名证书

https://unix.stackexchange.com/questions/451207/how-to-trust-self-signed-certificate-in-curl-command-line/468360#468360

echo quit | openssl s_client -showcerts -servername "curl.haxx.se" -connect curl.haxx.se:443 > cacert.pem

通过浏览器获取我们的自签名证书颁发机构

感谢这个答案和链接的博客,它展示了(在 Windows 上)如何查看证书然后使用 base64 PEM 编码选项复制到文件的步骤。

复制此导出文件的内容并将其粘贴至文件末尾cacerts.pem

为了保持一致性,请重命名此文件cacerts.pem-->ca-bundle.crt并将其放在容易放置的地方,例如:

# Windows
%USERPROFILE%certsca-bundle.crt

# Linux/macOS
$HOME/certs/cabundle.crt

通过 Python 获取我们的自签名证书颁发机构

感谢以下所有精彩答案:

如何从 python 中的请求中获取响应 SSL 证书?

我整理了以下内容以尝试更进一步。

https://github.com/neozenith/get-ca-py


最后

在 pip 和 conda 中设置配置,以便它知道此 CA 存储与我们的额外自签名 CA 位于何处。

# Windows
pip config set global.cert %USERPROFILE%certsca-bundle.crt
conda config --set ssl_verify %USERPROFILE%certsca-bundle.crt

或者

# Linux / macOS
pip config set global.cert $HOME/certs/ca-bundle.crt
conda config --set ssl_verify $HOME/certs/ca-bundle.crt

然后

pip config list
conda config --show ssl_verify

# Hot tip: use -v to show where your pip config file is...
pip config list -v
# Example output for macOS and homebrew installed python
For variant 'global', will try loading '/Library/Application Support/pip/pip.conf'
For variant 'user', will try loading '/Users/jpeak/.pip/pip.conf'
For variant 'user', will try loading '/Users/jpeak/.config/pip/pip.conf'
For variant 'site', will try loading '/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/pip.conf'

故障排除

根据下面的精彩评论

我试过了,但仍然出错SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)'))。有什么建议吗?

以下是故障排除指南:

当证书颁发机构尚未正确设置时,这是正常的错误消息。

需要检查的因素可能有多种:

  • ca-bundle.crt 的路径有适合你操作系统的正确路径分隔符(这让我很受困扰),

  • 您可能没有最新的 CA 来验证普通证书,

  • 您可能没有以正确的编码添加您的CA。

Python 有效地执行了这 3 个步骤:

  • 查找我的 CA 商店,

  • 阅读所有条目,

  • 在我的信任库中查找该证书。

如果其中任何一个失败,您就会根据经验收到此错误消息。

检查下面链接的答案以显示并检查您的ssl_cert_dir使用情况:

python -c "import ssl; print(ssl.get_default_verify_paths())"

参考

解决方案 2:

运行:python -c "import ssl; print(ssl.get_default_verify_paths())"检查当前用于验证证书的路径。将贵公司的根证书添加到其中一个路径。

该路径openssl_capath_env指向环境变量:SSL_CERT_DIR

如果SSL_CERT_DIR不存在,您需要创建它并将其指向文件系统内的有效文件夹。然后您可以将证书添加到此文件夹以使用它。

解决方案 3:

Windows 上的替代解决方案是安装 python-certifi-win32,它将允许 Python 使用 Windows 证书存储。

pip install python-certifi-win32

解决方案 4:

--cert这不是最好的答案,但您可以使用选项重用已经创建的 ca 包pip,例如:

pip install SQLAlchemy==1.1.15 --cert="C:UsersmyUsercertificatesmy_ca-bundle.crt"

解决方案 5:

在 Windows 上,我通过在 %APPDATA%\pip\ 中创建 pip.ini 文件解决了这个问题

例如 C:\Users\asmith\AppData\Roaming\pip\pip.ini

在 pip.ini 中我输入了我的证书的路径:

[global]
cert=C:UsersasmithSSL    eco-ca.crt

https://pip.pypa.io/en/stable/user_guide/#configuration有更多关于配置文件的信息。

解决方案 6:

我认为 nt86 的解决方案是最合适的,因为它利用了底层的 Windows 基础架构(证书存储)。但是它没有说明如何安装 python-certifi-win32,因为 pip 不起作用。

诀窍是--trustedhost安装 python-certifi-win32,然后 pip 将自动使用 Windows 证书存储区来加载代理使用的证书。

简而言之,你应该这样做:

pip install python-certifi-win32 -trustedhost pypi.org

之后你就可以开始了

解决方案 7:

在我的场景中,在 Ubuntu 上使用 python 3.8,我想看看我可以在本地系统中进行哪些更改(而不是代码或安装新包),以便我能够使用自定义 CA 和自签名证书。

因此我只是追踪了 python 所查找的位置:

strace python my_prog 2> out.txt

然后 grepped pem 的输出(您可能需要查找“crt” “cert”)

grep -i pem out.txt

尽管 certifi 没有被明确安装,但它正在寻找的文件是:

/path/to/virtualenv/for/project/lib/python3.8/site-packages/certifi/cacert.pem

所以我重命名了旧文件并将其链接到我的系统的 ca 包(例如,/etc/ssl/certs/ca-certificates.crt)

现在它成功了。

解决方案 8:

由于声誉点数太少,我无法评论 Josh 的《史上最伟大的回复》和 rfKorttekaas(虽然不那么史诗般,但也很有用),所以这里还有另一个提示。在我的情况下,这个错误是:

SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1123)')) 错误。

需要我找到并添加到cacerts.pem/ca-bundle.crt

  • 中级证书颁发机构的证书(用于我尝试添加的自签名证书)

  • 该中级 CA 的中级根证书

我通过从我的机器上的 certmgr.msc 导出正确的证书来获取它们(这是一种 corporation-vpn-hell 的情况,只有 pip 和 certify,其他答案中列出的方法对我来说不可用)。此外,如果添加环境变量(SSL_CERT_DIRSSL_CERT_FILE)似乎不起作用,请友情提醒您重新启动机器;)

解决方案 9:

在这篇文章中:

https://github.com/jorgenschaefer/elpy/issues/1936

他们建议:

M-x elpy-rpc-reinstall-virtualenv

它对我有用。

解决方案 10:

在防火墙使用内部 CA 颁发的证书的公司环境中:您需要将 FW 和 CA 链的公共证书内容附加到“C:\Python311\Lib\site-packages\pip_vendor\certifi\cacert.pem”中

解决方案 11:

打开 Anaconda Navigator。

转到文件\首选项。

启用 SSL 验证 禁用(不推荐)

或启用并指示 SSL 证书路径(可选)

将软件包更新到特定版本:

选择右上角的“安装”

选择包点击勾选

标记为更新

标记为特定版本安装

单击“应用”

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1289  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审(TR,Technical Review)环节至关重要,它不仅是对技术方案的评估,更是激发创新思维、推动产品创新的关键节点。深入理解TR在IPD流程中的创新思维及其应用实践...
IPD流程中TR   9  
  IPD(Integrated Product Development)产品开发流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它打破了传统产品开发过程中部门之间的壁垒,将市场、研发、生产、销售等各个环节有机整合在一起,形成一个高效协同的整体。通过这种方式,企业能够更快速、更精准地开发出满足市场需求的产品...
IPD管理流程   11  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审(TR,Technical Review)环节在整个IPD流程里占据着关键位置,对项目的成功有着深远影响。深入探讨TR与项目成功的关系,有助于企业更好地运用IPD流程,提升...
IPD项目管理   8  
  IPD研发管理体系旨在打破部门墙,实现跨部门协同,确保产品开发以市场和客户需求为导向,高效、高质量地推出满足市场需求的产品。在这一体系下,产品创新可拆解为三个关键步骤,它们环环相扣,共同推动企业的产品不断迭代升级,在激烈的市场竞争中占据优势。这三个步骤分别聚焦于洞察市场机会、规划产品战略以及执行开发与验证,每一步都蕴含...
IPD框架   10  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用