我刚从python.org安装了Python3,但在使用pip
安装软件包时遇到问题。根据设计,网络上有一个中间人的数据包检测设备,它通过使用自己的证书重新签名所有ssl连接来检查所有数据包(包括ssl)。部分GPO将自定义根证书推送到Windows密钥库。
使用Java时,如果我需要访问任何外部https站点,我需要手动更新JVM中的cacerts以信任自签名CA证书。
我如何为python实现这一目标?现在,当我尝试使用pip
安装软件包时,我可以理解[SSL: CERTIFICATE_VERIFY_FAILED]
错误。
我意识到我可以使用--trusted-host
参数忽略它们,但我不想为我正在尝试安装的每个软件包执行此操作。
有没有办法更新python使用的CA证书存储?
答案 0 :(得分:32)
pip
/ conda
在广泛记录了Git(How can I make git accept a self signed certificate?)的类似问题之后,在这里我们又位于公司防火墙的后面,该防火墙带有代理,为我们提供了我们应该信任的 MitM“攻击” ,并且:
切勿禁用所有SSL验证!
这会创建不良的安全文化。不要那个人。
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
?
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----
以下是有关如何获取我们的自签名证书的几种选择:
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
感谢以下所有出色的答案
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
在那之后你应该很好走