自签名证书颁发机构pip / conda
在用 Git (How can I make git accept a self signed certificate?) 大量记录类似问题后,我们再次位于公司防火墙后面,该代理提供了我们应该信任的MitM“攻击”,并且: p>
切勿禁用所有 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
但是我们从哪里得到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
通过浏览器获取我们的自签名证书颁发机构
感谢这个答案和链接的博客,它显示了如何查看证书然后使用 base64 PEM 编码选项复制到文件的步骤(在 Windows 上)。
复制此导出文件的内容并将其粘贴到 cacerts.pem 文件的末尾。
为了保持一致性,将此文件重命名为 cacerts.pem --> ca-bundle.crt 并将其放置在简单的地方,例如:
# Windows
%USERPROFILE%\certs\ca-bundle.crt
# Linux/macOS
$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 所在的位置。
# Windows
pip config set global.cert %USERPROFILE%\certs\ca-bundle.crt
conda config --set ssl_verify %USERPROFILE%\certs\ca-bundle.crt
或
# Linux / macOS
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'
疑难解答
基于下面的精彩评论
我已经尝试过了,但仍然收到 SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)')) 错误。有什么建议吗?
这是一个故障排除指南:
这是证书颁发机构尚未正确设置时的正常错误消息。
可能需要检查多种因素:
- 您的 ca-bundle.crt 的路径为您的操作系统提供了正确的路径分隔符(它让我很痛苦),
- 您可能没有最新的 CA 来验证普通证书,
- 您可能没有以正确的编码添加 CA。
Python 正在有效地执行这 3 个步骤:
- 查找我的 CA 商店,
- 阅读所有条目,
- 在我的信任库中查找此证书。
如果其中任何一个失败,您会根据经验收到此错误消息。
检查this answer linked from below 以显示并检查您的ssl_cert_dir 使用:
python -c "import ssl; print(ssl.get_default_verify_paths())"
参考文献