如何将自定义CA Root证书添加到Windows中pip使用的CA Store?


82

我刚刚从python.org安装了Python3,但无法使用来安装软件包pip。根据设计,这里的网络上有一个中间人数据包检查设备,该设备通过使用其自己的证书对所有SSL连接进行辞职来检查所有数据包(包括SSL)。GPO的一部分将自定义根证书推送到Windows密钥库中。

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

如何为python完成此操作?现在,当我尝试使用来安装软件包时pip,可以理解,我得到了很多[SSL: CERTIFICATE_VERIFY_FAILED]错误。

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

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


4
@rfkortekaas所有这些选项都涉及向流程添加新内容。Python必须使用存储在系统某处的默认信任库。我想修改该信任库。我不想添加额外的变量,不同的ca存储等。在java中,jvm依赖于自己的信任存储(与OS分开)。我怀疑python必须做类似的事情,因为我的根证书在我的Windows存储区中,而python无法识别。
埃里克·B。

Answers:


94

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

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

切勿禁用所有SSL验证!

这造成了不良的安全文化。不要做那个人。

tl; dr

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 Bundle

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-m


获得我们的自签名证书

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

  • 通过OpenSSL CLI
  • 通过浏览器
  • 通过Python脚本

通过OpenSSL CLI获取我们的自签名证书

/unix/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%\certs\ca-bundle.crt

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

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

感谢以下所有出色的答案:

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

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

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'

参考文献


5
有史以来最伟大的答案之一
凯文·保利

pip配置设置为global.trusted-host XXXXX.com
zzzz zzzz

在Windows中,使用.pem格式的证书对我有用。
DanielArgüelles19年

1
@DanielArgüelles是的,是的。大多数情况下,您可以不合并证书颁发机构捆绑包而逃脱,但是我有足够的时间需要完整的捆绑包,以便pip或conda可以验证其他服务器的证书。最终,捆绑包仍然是一个文本文件,其中包含许多pem文件的内容。很高兴它可以正常工作,您无需禁用验证!:D

42

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

路径openssl_capath_env指向环境变量:SSL_CERT_DIR

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


10
在我的Windows系统上,这将返回“ / usr / local / ssl / certs”,这在Windows上不可用。
Colin Talbert

1
在被拉到另一个项目后,我终于也开始做这件事了,类似于@ColinTalbert,它指向一个不存在的文件夹/usr/local/ssl/certs
Eric B.

我已经编辑了问题,希望可以解决此问题。
rfkortekaas

1
@rfkortekaas更新SSL_CERT_FILE或SSL_CERT_DIR变量无效。我刚刚为此问题创建了一个新的SO问题,因为它可能不只是一个如何更新PEM文件的问题,而是一个如何使python访问cygwin / Windows中正确路径的问题。
埃里克·B

1
我试过了。我最终~/.config/pip/pip.conf使用必要的设置创建了一个pip.conf文件。 看到这个答案
Eric B.

7

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

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

4

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

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

在pip.ini中,将路径放入证书:

[global]
cert=C:\Users\asmith\SSL\teco-ca.crt

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


嗨,Alex,您是如何在pip.ini文件中“放置”证书路径的?从命令行?您是否将文件路径键入记事本之类并将其保存为文本文件?我正在使用anaconda提示符,但我认为它类似于Windows。
spacedustpi

我使用记事本创建了一个文本文件,然后将文件扩展名从“ txt”更改为“ ini”。
亚历克斯(Alex)

啊。好的。您还必须在路径上方输入“ [gobal]”吗?您知道在哪里可以找到有关此类内容的教程吗?谢谢。
spacedustpi '18

是的,您也需要输入“ [global]”。抱歉,我不知道任何教程,但是pip.pypa.io/zh/stable/user_guide/#configuration具有更多信息。
亚历克斯(Alex)

谢谢,我尝试了两种方式,是的,“ [global]”没有问题。
spacedustpi

2

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

pip install python-certifi-win32

-1

打开Anaconda Navigator。

转到“文件\首选项”。

启用S​​SL验证禁用(不建议)

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

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

选择在右上安装

选择包裹点击勾号

标记为更新

标记为特定版本安装

点击应用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.