【问题标题】:Mac OSX python ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)Mac OSX python ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:749)
【发布时间】:2017-06-25 04:27:30
【问题描述】:

python 中的许多操作都需要通过 https 访问。这包括 pip install,或仅使用 http.client.HTTPSConnection,或在内部使用这些东西的任何模块或应用程序。

如果python是从官方python pkg安装程序安装的,从https://python.org下载的,那么它使用openssl的内部版本,并且不包含根证书。任何使用 SSL 连接都会导致此错误:

ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)

如何安装根证书以消除上述错误?

【问题讨论】:

标签: python macos ssl


【解决方案1】:

当您运行 python 安装程序时,它们会向您显示此信息。它也在/Applications/Python 3.6/ReadMe.rtf 中有记录,但很容易被忽略。

只需浏览到Applications/Python 3.6 并双击Install Certificates.command

Python 错误跟踪器中有一个关于此的问题。 http://bugs.python.org/issue29480

更新:此问题在错误跟踪器中标记为已解决,此文本是最新评论的一部分:

... 对于 3.7.0b2,我尝试通过两种方式让事情变得更加明显。一,安装程序包现在将尝试为包含“Install Certificates.command”的 /Application/Python 3.7 文件夹打开一个 Finder 窗口。第二,在安装结束时不再只是一般的“安装完成”消息,现在有一个定制的消息,敦促用户单击“Install Certificates.command”图标。 ...

【讨论】:

  • 如果没有root权限,有没有解决办法?谢谢。
  • 我运行了 Install Certificates.command 文件,但如果我在代码中使用 https URL(读取内容),错误仍然存​​在(在 Py36 中)。如果我使用相同的 URL 字符串减去“s”(例如 http),我的代码就可以工作。不幸的是,对于某些 URL,我需要 https。对此有何建议? (我还运行了“pip3 install --upgrade certifi”,因为我需要同时运行 Py27 和 Py36)
  • 这不起作用;正如@ultrageek 提到的那样,所有错误都仍然存在。此外,请列出实际命令,而不是与特定 Python 版本捆绑的别名。 -1.
  • 知道如果我使用 anaconda 安装了 python 该怎么办吗?我没有在任何地方看到 Install Certificates.command
  • 我的应用程序文件夹中没有 Python
【解决方案2】:

如果你仍然安装了 python3.5,一个便宜的方法就是使用它。

推送到 PyPI:

python3.5 setup.py register -r pypitest

python3.5 setup.py sdist upload -r pypitest

开箱即用的 3.6 似乎可以正常工作..

【讨论】:

    【解决方案3】:

    如果您使用的是 macOS 打开 finder 并转到 Applications > Python3.7 文件夹(或您使用的任何 python 版本)> 双击“Install Certificates.command”文件。

    【讨论】:

      【解决方案4】:

      当我尝试使用 Keras 数据加载运行 Python 时,我遇到了同样的问题。我的错误是:

      Exception: URL fetch failure on AWS_URL: None -- [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)
      

      我通过升级证书解决了我的问题:

      pip install --upgrade certifi
      

      【讨论】:

      • 嗨!是pip install --upgrade certificate 不是吗?我对您的帖子进行了编辑,但不确定这是拼写错误还是我不知道的模块。
      • 还是这个module?那就请大家指正!
      • 不是拼写错误,只是模块名。
      【解决方案5】:

      我用这个命令解决了这个问题:

      open /Applications/Python\ 3.7/Install\ Certificates.command
      

      我的机器中有 Python 3.7。

      检查此链接 - Fixing CERTIFICATE_VERIFY_FAILED error when trying requests-html out on Mac

      【讨论】:

        【解决方案6】:

        在我的情况下,没有一个解决方案适用于在 macOS Catalina 中安装 python3 的系统,也不适用于通过 brew 安装的 python3。

        如果有人遇到这种情况并想要快速解决方案,
        再次下载并安装 python3,使用 https://www.python.org/downloads/

        安装结束时,安装程​​序会显示一条提示,要求运行Install Certificates.command 文件。
        (在其他安装中,该文件不存在,the solution 文件的源代码也不存在)

        重启终端,可以输入where python3,看到/Library/Frameworks/Python.framework/Versions/3.8/bin/python3。使用这个二进制文件应该不会出现问题。

        注意:有可能使系统安装的 python3 工作,但在我的情况下;事实证明这非常困难,所以我选择了这种方式。

        【讨论】:

        • 当我试图让我的 bitbar python3 插件工作时,这让我在 Catalina 上找到了正确的解决方案。我看到我用which python3 安装了几个python3 并将脚本shebang 更改为#!/usr/local/bin/python3 修复了SSL 错误。谢谢!
        【解决方案7】:

        为您的所有 python 版本解决此问题的好方法,无需在 macOS 上检查您的版本

        bash /Applications/Python*/Install\ Certificates.command
        

        这个命令相当于:

        ...
        bash /Applications/Python\ 2.7/Install\ Certificates.command
        bash /Applications/Python\ 3.6/Install\ Certificates.command
        bash /Applications/Python\ 3.7/Install\ Certificates.command
        ...
        

        对我有帮助,希望对你也有帮助

        【讨论】:

          【解决方案8】:

          如果 pip 不能解决问题

          pip3 install --upgrade certifi
          

          如果找不到“Install Certificates.command”,请尝试以下脚本

          #!/usr/bin/env python3
          # install_certifi.py
          #
          # sample script to install or update a set of default Root Certificates
          # for the ssl module.  Uses the certificates provided by the certifi package:
          #       https://pypi.python.org/pypi/certifi
          
          import os
          import os.path
          import ssl
          import stat
          import subprocess
          import sys
          
          STAT_0o775 = ( stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
                       | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
                       | stat.S_IROTH |                stat.S_IXOTH )
          
          
          def main():
              openssl_dir, openssl_cafile = os.path.split(
                  ssl.get_default_verify_paths().openssl_cafile)
          
              # +++> if already done  <----
              #print(" -- pip install --upgrade certifi")
              #subprocess.check_call([sys.executable,
              #    "-E", "-s", "-m", "pip", "install", "--upgrade", "certifi"])
          
              import certifi
              # change working directory to the default SSL directory
              os.chdir(openssl_dir)
              relpath_to_certifi_cafile = os.path.relpath(certifi.where())
              print(" -- removing any existing file or link")
              try:
                  os.remove(openssl_cafile)
              except FileNotFoundError:
                  pass
              print(" -- creating symlink to certifi certificate bundle")
              os.symlink(relpath_to_certifi_cafile, openssl_cafile)
              print(" -- setting permissions")
              os.chmod(openssl_cafile, STAT_0o775)
              print(" -- update complete")
          
          if __name__ == '__main__':
              main()
          

          【讨论】:

          • 谢谢。为我工作。可能是在许多情况下唯一可行的解​​决方案。
          • 也可以在 ubuntu 上运行!感谢上帝
          • 即使我找到了Install Certificates.command,我也不得不运行这个脚本来解决问题。我用过分热心的find ... -delete 让我的环境变得非常好,这可能有所贡献。
          • 我间歇性地遇到这个问题好几年了,这个脚本解决了它。你是开发者中的英雄。
          • 在这上面花了几个小时并尝试了许多其他 SO 解决方案......这是唯一有效的解决方案。我正在使用 Homebrew 安装的 Python 3.8。
          【解决方案9】:

          对我来说,这是对请求的错误说明。我打了一个https 电话而不是http 电话。改成 http 解决了。

          【讨论】:

            【解决方案10】:

            确认您不在虚拟环境中。 我尝试了上述方法但没有成功,只是意识到我的安装失败了,因为我在 virtualenv 上

            【讨论】:

              【解决方案11】:

              确保您没有设置SSL_CERT_FILE 环境变量。我遇到了同样的问题,我花了一段时间才发现某些应用程序在我的 bash 配置文件中将此变量设置为空字符串。

              【讨论】:

                【解决方案12】:

                我在使用 macOS Big Sur 时遇到了同样的问题。这是我为解决问题所做的。

                IDE - Pycharm

                已下载 Python 版本 - 3.9.6

                • 下载最新的python版本并删除旧版本
                • 安装时,最后(摘要部分)有一个小说明,用于安装 SSL 证书。仔细阅读摘要部分。
                • 双击摘要中提供的 SSL 证书路径
                • 它将带您到相应的文件夹,其中应该有一个名为“安装证书命令”的文件
                • 双击该文件,它应该会打开终端并自动运行代码。等到您收到“[成功完成]”的消息。
                • 完成后关闭并重新启动终端/IDE,这应该可以解决您的问题。

                注意:如果您的系统上同时安装了 anaconda 和 python,请检查您是否在 IDE 中使用正确的 python 版本,最新版本是从 Anaconda 下载的,而不是从 Anaconda 下载的。

                享受吧。

                【讨论】:

                  【解决方案13】:

                  只需在 Mac 上重新安装 Python

                  【讨论】:

                    【解决方案14】:

                    有时,如果您使用 conda 或诗歌,您可能处于虚拟环境 shell 中。你可以检查:

                    which python

                    对我来说,解决方案就像 cmd+t 打开一个新的 shell 一样简单。

                    【讨论】:

                      【解决方案15】:

                      如果您使用的是 MacOS,请转到 Applications >> python3.8 >> 并双击 Install Certificates.command。 这对我有用。

                      【讨论】:

                        猜你喜欢
                        • 2017-06-01
                        • 2019-03-12
                        • 2018-03-15
                        • 2018-07-29
                        • 2023-03-03
                        • 1970-01-01
                        • 2020-01-14
                        • 1970-01-01
                        • 2015-12-21
                        相关资源
                        最近更新 更多