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

时间:2016-09-06 19:24:31

标签: python windows ssl pip

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

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

我如何为python实现这一目标?现在,当我尝试使用pip安装软件包时,我可以理解[SSL: CERTIFICATE_VERIFY_FAILED]错误。

我意识到我可以使用--trusted-host参数忽略它们,但我不想为我正在尝试安装的每个软件包执行此操作。

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

7 个答案:

答案 0 :(得分:32)

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

在广泛记录了Git(How can I make git accept a self signed certificate?)的类似问题之后,在这里我们又位于公司防火墙的后面,该防火墙带有代理,为我们提供了我们应该信任的 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-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上(如何在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

OR

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

参考文献

答案 1 :(得分:30)

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

路径openssl_capath_env指向环境变量:SSL_CERT_DIR

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

答案 2 :(得分:7)

不是最佳答案,但您可以使用--cert的{​​{1}}选项重复使用已创建的ca包,例如:

pip

答案 3 :(得分:2)

在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/en/stable/user_guide/#configuration具有有关配置文件的更多信息。

答案 4 :(得分:1)

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

pip install python-certifi-win32

答案 5 :(得分:0)

打开Anaconda导航器。

转到“文件\首选项”。

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

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

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

选择右上安装

选择包裹,点击勾号

标记为更新

标记为特定版本安装

点击应用

答案 6 :(得分:0)

我认为nt86的解决方案是最合适的,因为它利用了底层Windows基础结构(证书存储)。 但这并未说明如何安装python-certifi-win32,因为pip无法正常工作。

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

因此,简而言之,您应该这样做:

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

在那之后你应该很好走