/usr/bin/python3
均因SSL: CERTIFICATE_VERIFY_FAILED
而失败。来自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)>
如何解决这个问题?
(我知道答案,很快就会发布;只是在其他人遇到的情况下分享它即可。)
答案 0 :(得分:5)
作为@ 4ae1e1答案的补充,您可以创建指向SSL文件夹的符号链接,而不是使其同步。这将带来更多好处,即可以将/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/
应该这样做。
答案 1 :(得分:1)
问题是,/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
,它不存在。
知道了这一点,我们可以使用以下技巧:
$ sudo rsync -avzP /etc/ssl/ /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/etc/ssl/
我已经向Apple提交了一个错误报告(顺便说一句,刚刚意识到bugreport.apple.com现在不见了,我不得不使用Feedback Assistant网站)。打开雷达https://openradar.appspot.com/7111585(不幸的是,该雷达号是错误的-由于bugreport.apple.com已经消失,我不再有雷达号,只有反馈号FB7111585
)。
答案 2 :(得分:0)
根据this GitHub issue,Apple拒绝解决此问题:
问题的行为符合预期。
certifi
是第三方模块,不是Python本身的一部分。
urllib
是一个低级库。它可以处理SSL,但是您必须使用cafile
明确设置SSL上下文。请尝试以下操作:
pip3 install requests python3 -c 'import requests; print(requests.get("https://apple.com").text)'
如果只想获取
cacert.pem
,则可以使用pip3 install certifi
,但仍必须将cafile
显式传递给urllib
。
所以我的解决方案只是使用Requests。这是受支持的,并且将来会得到证明。
答案 3 :(得分:0)
在更新为catalina后导入“请求”包时,我遇到了“中止6”问题。在寻找解决方案时,我被带到了这个页面。不幸的是,以上都不对我有用,但是...
从python.org手动更新到python 3.8似乎对我来说很容易解决此问题。遇到错误时,我不得不重新安装我的所有软件包(带有pip3),但这还不错。
到目前为止,我没有看到我的任何项目都遇到python3.8的问题(使用3.7一段时间)
希望这对某人有帮助! 感谢您的所有其他建议和努力!
答案 4 :(得分: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
答案 5 :(得分:-1)
python3.6 -c 'import requests; requests.get("https://www.apple.com/")'
尝试使用它。 检查是否适合您。