10

/usr/bin/python3来自 macOS 10.15 上的 Xcode/CLT(目前为 DB6/PB5,带有 Xcode 11 beta 6)SSL: CERTIFICATE_VERIFY_FAILED对于源自 PSL 的所有 HTTPS 请求失败,例如来自urllib.request

$ /usr/bin/python3 -c 'import urllib.request; urllib.request.urlopen("https://www.apple.com/")'
...
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)>

如何解决这个问题呢?

(我知道答案,很快就会发布;只是分享它以防其他人遇到它。)

4

6 回答 6

27

作为@4ae1e1 答案的补充,您可以创建指向 SSL 文件夹的符号链接,而不是对其进行 rsync。这将带来额外的好处,即使任何更改保持在/etc/ssl最新的/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/etc/ssl/.

/usr/bin/sudo /bin/mkdir /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/etc
/usr/bin/sudo /bin/ln -s /etc/ssl/ /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/etc/

应该这样做。

于 2019-09-27T04:43:16.993 回答
11

问题是/usr/bin/python3(来自 Xcode 或 CLT)无法正确定位信任存储在 中/etc/ssl,我们可以看到使用ssl.get_default_verify_paths()

$ /usr/bin/python3 -c 'import ssl; print(ssl.get_default_verify_paths())'
DefaultVerifyPaths(cafile=None, capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/etc/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/etc/ssl/certs')

它正在调查/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/etc/ssl,它不存在。

知道了这一点,我们可以使用以下 hack:

$ sudo rsync -avzP /etc/ssl/ /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/etc/ssl/

我已经向 Apple 提交了错误报告(顺便说一句,我刚刚意识到 bugreport.apple.com 现在已经消失了,我不得不使用反馈助手网站)。打开雷达https://openradar.appspot.com/7111585(不幸的是,那个雷达号是错误的——因为 bugreport.apple.com 已经消失了,我不再有雷达号,只有一个反馈号FB7111585)。

于 2019-08-23T16:57:02.863 回答
0

在更新到 catalina 后导入“请求”包时,我遇到了“中止 6”的问题。在寻找解决方案时,我被带到了这个页面。不幸的是,上述方法都不适合我,但是......

从 python.org 手动更新到 python 3.8 对我来说似乎很容易解决这个问题。当我遇到错误时,我不得不重新安装我的所有软件包(w/pip3),但这还不错。

到目前为止,我没有看到我的任何项目与 python3.8 有问题(使用 3.7 有一段时间了)

希望这对某人有帮助!感谢所有额外的建议和努力!

于 2020-06-02T23:36:24.273 回答
0

您应该重新安装包含 Python 的 Xcode 命令行工具。

pip3 uninstall -y -r <(pip requests certifi)
brew uninstall --ignore-dependencies python3

sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install
sudo xcode-select -r

python3 -m pip install --user certifi
python3 -m pip install --user requests
于 2021-07-04T18:02:56.623 回答
0

根据this GitHub issue,Apple拒绝解决此问题:

问题按预期运行。

certifi是第三方模块,不是 Python 本身的一部分。

urllib是一个低级库。它可以处理 SSL,但您必须使用cafile.

请尝试以下操作:

pip3 install requests
python3 -c 'import requests; print(requests.get("https://apple.com").text)'

如果你只想得到cacert.pem,你可以使用pip3 install certifi,但你仍然必须显式传递cafileurllib

所以我的解决方案只是使用 Requests 代替。这是支持和未来证明。

于 2020-02-21T08:43:28.963 回答
-3

python3.6 -c 'import requests; requests.get("https://www.apple.com/")'

尝试使用这个。检查这是否适合您。

于 2019-09-27T05:06:51.393 回答