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



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

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

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

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

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

签名证书颁发机构pip/conda

在广泛记录了 Git 的类似问题(如何让 git 接受自签名证书?(之后,这里我们再次处于企业防火墙后面,代理给我们一个我们应该信任的 MitM"攻击">,并且:

切勿禁用所有SSL验证!

这造成了糟糕的安全文化。不要成为那样的人。

更新 2022 蟒蛇 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

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

  • 获取您的 CA:https://stackoverflow.com/a/50486128/622276
    • http://blog.majcica.com/2016/12/27/installing-self-signed-certificates-into-git-cert-store/

多亏了这个答案和链接的博客,它显示了(在 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())"

引用

  • 点 SSL: https://pip.pypa.io/en/stable/user_guide/#configuration
  • 康达SSL:https://stackoverflow.com/a/35804869/622276
  • 获取您的 CA:https://stackoverflow.com/a/50486128/622276
    • http://blog.majcica.com/2016/12/27/installing-self-signed-certificates-into-git-cert-store/
  • 使用 Python 自动抓取你的 Peer CA:如何从 python 中的请求中获取响应 SSL 证书?

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

路径openssl_capath_env指向环境变量:SSL_CERT_DIR

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

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

pip install python-certifi-win32

不是最佳答案,但您可以使用pip选项重用已创建的 ca 捆绑--cert例如:

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

在 Windows 上,我通过在 %APPDATA%\pip\ 中创建 pip.ini 文件来解决它

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

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

[global]
cert=C:UsersasmithSSLteco-ca.crt

https://pip.pypa.io/en/stable/user_guide/#configuration 提供了有关配置文件的详细信息。

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

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

所以简而言之,你应该做:

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

在那之后你应该很高兴去

在我的场景中,在使用python 3.8的Ubuntu上,我想看看我可以在本地系统中更改什么(而不是代码或安装新软件包(,这将允许我使用我的自定义CA和我的自签名证书。

所以我只是追踪了python在看哪里:

strace python my_prog 2> out.txt

然后对 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(

现在它奏效了。

我不能评论乔希的《有史以来最伟大的回复》,也不能评论 rfKorttekaas 不那么史诗,但由于声誉点太少,它也很有用,所以这里有另一个提示。就我而言,此错误:

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

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

  • 中间证书颁发机构的证书(对于我尝试添加的自签名证书(
  • 该中间 CA 的中间根证书

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

在这篇文章中:

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

他们建议:

M-x elpy-rpc-reinstall-virtualenv

它对我有用。

在防火墙使用内部 CA 颁发的证书的企业环境中:您需要将固件和 CA 链的公共证书的内容附加到"C:\Python311\Lib\site-packages\pip_vendor\certifi\cacert.pem"<</p>

div class="one_answers">

打开 Anaconda Navigator。

转到"文件\首选项"。

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

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

将包更新到特定版本:

选择右上角的安装

选择包装点击勾号

标记为更新

标记特定版本安装

点击应用。

最新更新