如何将自定义 CA 根证书添加到 Windows 中 pip 使用的 CA 存储?
- 2025-02-27 09:08:00
- admin 原创
- 30
问题描述:
我刚刚从 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----
获取自签名证书
以下是如何获取自签名证书的一些选项:
通过 OpenSSL CLI
通过浏览器
通过 Python 脚本
通过 OpenSSL CLI 获取自签名证书
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())"
参考
Pip SSL:https ://pip.pypa.io/en/stable/user_guide/#configuration
使用 Python 自动获取你的 Peer CA:如何从 python 中的请求中获取响应 SSL 证书?
解决方案 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_DIR
,SSL_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 证书路径(可选)
将软件包更新到特定版本:
选择右上角的“安装”
选择包点击勾选
标记为更新
标记为特定版本安装
单击“应用”
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)