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

2024-06-13 07:16:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

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


Tags: piphttpsorg网络ssl站点windows密钥
3条回答

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

路径openssl_capath_env指向环境变量:SSL_CERT_DIR

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

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

在广泛记录了Git(How can I make git accept a self signed certificate?)的一个类似问题之后,我们又在一个公司防火墙后面,一个代理给了我们一个我们应该信任的MitM“攻击”,并且:

NEVER disable all SSL verification!

This creates a bad security culture. Don't be that person.

tl;博士

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

我建议您在文本编辑器中打开这个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

通过浏览器获取我们的自签名证书授权

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

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

为了保持一致性,请重命名此文件cacerts.pem-->;ca-bundle.crt,并将其放置在以下位置:

# Windows
%USERPROFILE%\certs\ca-bundle.crt

# or *nix
$HOME/certs/cabundle.crt

通过Python获取我们的自签名证书授权

感谢所有精彩的回答:

How to get response SSL certificate from requests in python?

我把下面的内容放在一起,试图更进一步。

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


最后

在pip和conda中设置配置,以便它知道这个CA存储在我们额外的自签名CA中的位置

pip config set global.cert %USERPROFILE%\certs\ca-bundle.crt
conda config --set ssl_verify %USERPROFILE%\certs\ca-bundle.crt

或者

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'

参考文献

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

pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"

相关问题 更多 >