【问题标题】:SSL: CERTIFICATE_VERIFY_FAILED error with python3 on macOS 10.15SSL:在 macOS 10.15 上使用 python3 出现 CERTIFICATE_VERIFY_FAILED 错误
【发布时间】:2019-12-29 00:23:29
【问题描述】:

/usr/bin/python3 来自 macOS 10.15 上的 Xcode/CLT(目前为 DB6/PB5,使用 Xcode 11 beta 6)对于源自 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)>

如何解决这个问题?

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

【问题讨论】:

  • 顺便说一句 stackoverflow.com/questions/44261444/… 有点相关,但这是第三方安装(天知道是什么渠道),而这是苹果提供的官方发行版。
  • 我认为这个问题是关于 PSF 提供的安装程序。

标签: python macos macos-catalina


【解决方案1】:

作为@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/

应该这样做。

【讨论】:

  • 如果显示“没有这样的文件或目录”,请使用 -pmkdir
【解决方案2】:

问题是/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)。

【讨论】:

  • 在执行rsync hack 之前,我遇到了错误说/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/etc/ssl/ 不存在。最后,我在做rsync之前运行/usr/bin/sudo /bin/mkdir /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/etc创建etc目录(由@bheinz回答提供),终于成功了。
  • 更新:现在他们认为他们解决了这个问题,但他们没有。现在cafile指向Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/etc/ssl/cert.pem,但整个etc文件夹在3.7文件夹下不存在,所以他们仍然无法解析正确的证书。
  • 更新:Apple 的态度是“改用 Requests”。
【解决方案3】:

根据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 代替。这是支持和未来证明。

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

      您应该重新安装包含 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
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-06-04
          • 2020-06-16
          • 2020-10-08
          • 1970-01-01
          • 1970-01-01
          • 2017-11-21
          • 2020-02-27
          • 2019-12-20
          相关资源
          最近更新 更多