SSL:macOS 10.15上的python3导致CERTIFICATE_VERIFY_FAILED错误

时间:2019-08-23 16:51:11

标签: python macos macos-catalina

对于源自PSL的所有HTTPS请求,例如,来自macOS 10.15(目前为DB6 / PB5,具有Xcode 11 beta 6)的Xcode / CLT上的

/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)>

如何解决这个问题?

(我知道答案,很快就会发布;只是在其他人遇到的情况下分享它即可。)

6 个答案:

答案 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/")'

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