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

Eri*_* B. 56 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证书存储?

Jos*_*eak 59

自签证书机构pip/conda

在用Git广泛记录类似的问题之后(我怎样才能让git接受自签名证书?),在这里我们再次在公司防火墙后面用代理给我们一个我们应该信任的MitM"攻击",并且:

永远不要禁用所有SSL验证!

这会产生糟糕的安全文化.不要那个人.

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
Run Code Online (Sandbox Code Playgroud)

但是我们从哪里来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----
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

为了保持一致性,请重命名此文件cacerts.pem- > ca-bundle.crt并将其放置在容易的地方:

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

# or *nix
$HOME/certs/cabundle.crt
Run Code Online (Sandbox Code Playgroud)

通过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
Run Code Online (Sandbox Code Playgroud)

要么

pip config set global.cert $HOME/certs/ca-bundle.crt
conda config --set ssl_verify $HOME/certs/ca-bundle.crt
Run Code Online (Sandbox Code Playgroud)

然后

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'
Run Code Online (Sandbox Code Playgroud)

参考

  • 有史以来最伟大的答案之一 (2认同)
  • @DanielArgüelles 是的,没错。大多数情况下,您可以不合并证书颁发机构捆绑包,但我已经有足够多的时间需要完整的捆绑包,以便 pip 或 conda 可以验证其他服务器的证书。最终,捆绑包仍然是一个包含大量 pem 文件内容的文本文件。很高兴它有效,并且您不需要禁用验证!:D (2认同)
  • @JoshPeak,有什么方法可以尝试调试它以查看它到底失败在哪里?我已经[发布了这个问题](/sf/ask/4732681341/)并描述了我所做的事情。 (2认同)
  • 杰出的!必须将代理所需的自签名证书和 pypi.org 包存储站点证书合并到 *ONE* 证书文件中是我几天来一直试图找到的解决方案! (2认同)
  • @beneM 是的,我尝试了多个文件,看起来它应该识别 CA 文件夹,但将其全部附加到一个文件中是唯一对我有用的文件。 (2认同)
  • @JoshPeak您能否修改此答案以包括 Pip 通过名为“truststore”的库使用系统信任存储的新实验支持?https://pip.pypa.io/en/latest/user_guide/#using-system-trust-stores-for-verifying-https (2认同)
  • 请注意,当您从 获取自己的自签名 CA 证书时,如果您使用浏览器方法,您可能会发现有多个。您可能需要添加所有这些 (2认同)

rfk*_*aas 33

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

该路径openssl_capath_env指向环境变量:SSL_CERT_DIR.

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

  • 在我的Windows系统上,它返回'/ usr/local/ssl/certs',这在Windows上不可用. (10认同)
  • 我试过。我最终在 `~/.config/pip/pip.conf` 中创建了一个 pip.conf 文件并进行了必要的设置。[参见这个答案](http://stackoverflow.com/a/39626495/827480)。 (3认同)
  • 在被拉到另一个项目后,我终于也开始这样做了,与@ColinTalbert 类似,它指向一个不存在的文件夹`/usr/local/ssl/certs`。 (2认同)
  • @rfkortekaas 更新 SSL_CERT_FILE 或 SSL_CERT_DIR 变量不起作用。我刚刚为这个问题创建了一个[新的SO问题](http://stackoverflow.com/q/39356413/827480),因为它可能不仅仅是如何更新PEM文件的问题,而是如何让python访问 cygwin/Windows 中的正确路径。 (2认同)

nt8*_*t86 12

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

pip install python-certifi-win32
Run Code Online (Sandbox Code Playgroud)

  • `python-certifi-win32` 已被 [`pip-system-certs`](https://gitlab.com/alelec/python-certifi-win32/-/issues/16) 替换pypi.org/project/pip-system-certs/)。 (9认同)
  • 第一次你想做`pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org python-certifi-win32` (4认同)
  • 不确定我的安装有何不同,但这样做(包括建议的“--trusted-host”标志)成功完成,但破坏了“pip”..所有后续对“pip”的调用都崩溃了,我什至无法“pip”卸载 python-certifi-win32`。我手动重命名了这些文件,这样 pip 就能再次工作并证明这是罪魁祸首。 (2认同)

atu*_*ano 7

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

pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 5

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

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

在 pip.ini 我把我的证书的路径:

[global]
cert=C:\Users\asmith\SSL\teco-ca.crt
Run Code Online (Sandbox Code Playgroud)

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


归档时间:

查看次数:

82239 次

最近记录:

5 年,11 月 前