SSL: CERTIFICATE_VERIFY_FAILED 错误与 macOS 10.15 上的 python3

4ae*_*1e1 10 python macos macos-catalina

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

如何解决这个问题呢?

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

bhe*_*inz 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/
Run Code Online (Sandbox Code Playgroud)

应该做。

  • 如果显示“没有这样的文件或目录”,请使用“-p”和“mkdir”。 (2认同)

4ae*_*1e1 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')
Run Code Online (Sandbox Code Playgroud)

它正在调查/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/
Run Code Online (Sandbox Code Playgroud)

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

  • 在执行“rsync”黑客之前,我遇到错误说“/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` 来创建 `etc` 目录(由 @bheinz 答案提供)在执行 `rsync` 之前,终于成功了。 (2认同)