【问题标题】:SSL: CERTIFICATE_VERIFY_FAILED with Python3SSL:使用 Python3 的 CERTIFICATE_VERIFY_FAILED
【发布时间】:2016-06-04 18:55:22
【问题描述】:

如果这是一个愚蠢的问题,我深表歉意,但我一直在尝试自学如何使用 BeautifulSoup,以便我可以创建一些项目。

我正在关注此链接作为教程:https://www.youtube.com/watch?v=5GzVNi0oTxQ

按照与他完全相同的代码后,这是我得到的错误:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 1240, in do_open
    h.request(req.get_method(), req.selector, req.data, headers)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1083, in request
    self._send_request(method, url, body, headers)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1128, in _send_request
    self.endheaders(body)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1079, in endheaders
self._send_output(message_body)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 911, in _send_output
    self.send(msg)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 854, in send
    self.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1237, in connect
server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 376, in wrap_socket
_context=self)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 747, in __init__
self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 983, in do_handshake
    self._sslobj.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 628, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)

在处理上述异常的过程中,又发生了一个异常:

Traceback (most recent call last):
  File "WorldCup.py", line 3, in <module>
    x = urllib.request.urlopen('https://www.google.com')
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 162, in urlopen
    return opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 465, in open
    response = self._open(req, data)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 483, in _open
'_open', req)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 443, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 1283, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 1242, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]     certificate verify failed (_ssl.c:645)>

谁能帮我弄清楚如何解决这个问题?

【问题讨论】:

  • 你在尝试什么网址?主机是否使用自签名证书?
  • www.google.com,就像他在视频中所做的那样。我的代码和他的一样。
  • 我在使用的任何其他网站(例如 youtube.com、wikipedia.com 等)都遇到同样的错误
  • 我遇到了和之前一样的错误。它不工作“/我知道它工作得更早,因为我能够在另一个网站上使用它。

标签: python python-3.x macos urllib


【解决方案1】:

转到安装 Python 的文件夹,例如,在我的情况下(Mac OS),它安装在 Applications 文件夹中,文件夹名称为“Python 3.6”。现在双击“安装 Certificates.command”。您将不会再遇到此错误。

对于那些没有运行 mac 或具有不同设置且无法找到此文件的用户,该文件仅运行:

pip install --upgrade certifi

希望对某人有所帮助:)

【讨论】:

  • 代码的意义是什么 - 它应用了哪些更改 - 需要解释一下吗?
  • 致那些说找不到这个文件的人——这个解决方案只有 Apple 产品。
  • 非常感谢!它也适用于 Python3.7 :)
  • 只有这个命令有效。它安装了正确的证书。我已经尝试过 numuours,但对 stackoverflwo 失去了信任。
【解决方案2】:

就我而言,我使用ssl 模块来“解决”认证,如下所示:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

然后要阅读您的链接内容,您可以使用:

urllib.request.urlopen(urllink)

【讨论】:

  • 很好的解决方案。工作并帮助我首先弄清楚发生了什么。
  • 工作得很好,我找不到“Install Certificates.command”,但这个解决方案在证书问题上工作得很好。
  • NameError: name 'urllib' is not defined
  • @BrianD 检查您的 Python 版本。 urllib 导入路径在最新版本的 Python 中已更改。
  • 如何从urllib.request.urlopen(urllink) 获取页面内容?换句话说,什么相当于requests.get(MY_URL).content
【解决方案3】:

当您使用自签名证书时,urllib3 版本 1.25.3 拒绝忽略 SSL 证书

修复删除 urllib3-1.25.3 并安装 urllib3-1.24.3

pip3 uninstall urllib3

pip3 install urllib3==1.24.3

在 Linux MacOS 和 Window$ 上测试

【讨论】:

  • 我试过这个,但它对我不起作用(仍然得到同样的错误)。就我而言,我认为证书有效但未被使用。
  • 如果您的目标具有有效证书,则不需要此修复。要检查您的站点是否具有有效的证书,请运行:curl https://target.web.site/ 如果您收到消息“SSL 证书问题:自签名证书”,则您的目标上有一个自签名证书。如果您从网站上得到正确答案,则证书有效。
  • 是的,我看到的错误是我的本地机器的证书没有被使用。目标的证书很好。
【解决方案4】:

在 Debian 9 上我必须:

$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs

我不知道为什么,但这个环境变量从未设置过。

【讨论】:

  • 谢谢,我在手动安装 Python 3.8 后在 Raspbian Stretch 上遇到了同样的问题,并解决了设置该环境变量的问题。
  • 可能甚至不需要更新证书 - 在我的情况下,只需导出路径即可。
  • 我在安装新的 pip 包后开始遇到这个问题。正如@Kaja 提到的那样,在 Ubuntu 20.04 上导出路径也对我有用。
  • 第二行对我来说适用于 Mac OS Big Sur。
【解决方案5】:

我在 MacOS 中遇到了这个问题,我通过将 brew 安装的 python 3 版本与

链接解决了这个问题
brew link python3

之后,它就没有问题了。

【讨论】:

  • 虽然仅通过 Brew 安装 python3 可能会解决此问题,但它并不能解决根本原因。仅供查看此答案的任何人参考。
【解决方案6】:

我有一个使用 https://requests.readthedocs.io/en/master/ 的库,使用 https://pypi.org/project/certifi/,但我的 /etc/ssl/certs 中包含一个自定义 CA。

所以我这样解决了我的问题:

# Your TLS certificates directory (Debian like)
export SSL_CERT_DIR=/etc/ssl/certs
# CA bundle PATH (Debian like again)
export CA_BUNDLE_PATH="${SSL_CERT_DIR}/ca-certificates.crt"
# If you have a virtualenv:
. ./.venv/bin/activate
# Get the current certifi CA bundle
CERTFI_PATH=`python -c 'import certifi; print(certifi.where())'`

test -L $CERTFI_PATH || rm $CERTFI_PATH
test -L $CERTFI_PATH || ln -s $CA_BUNDLE_PATH $CERTFI_PATH

等等!

【讨论】:

    【解决方案7】:

    这在 ssl 库的最新版本中有所改变。 SSLContext 已移至其自己的属性。这相当于贾在 Python 3.8 中的回答

    import ssl
    
    ssl.SSLContext.verify_mode = ssl.VerifyMode.CERT_OPTIONAL
    

    【讨论】:

      【解决方案8】:

      我在 Ubuntu 20.4 上遇到了同样的问题,并且尝试了很多解决方案,但都没有成功。最后我刚刚检查了 openssl 版本。即使在更新和升级之后,openssl 版本仍显示 OpenSSL 1.1.1h [22 Sep 2020]。但在我的 Windows 系统中,代码可以正常运行,openssl 版本是 OpenSSL 1.1.1k 25 Mar 2021

      我决定手动更新 openssl 并且成功了!感谢上帝!!!

      步骤如下(Ubuntu 20.4):

      *查看openssl版本

      openssl version -a
      

      *更新openssl:

      sudo apt install build-essential checkinstall zlib1g-dev
      
      cd /usr/local/src/
      
      sudo wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
      
      sudo tar -xf openssl-1.1.1k.tar.gz
      
      cd openssl-1.1.1k
      
      sudo ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
      sudo make
      sudo make test
      sudo make install
      
      cd /etc/ld.so.conf.d/
      sudo nano openssl-1.1.1k.conf
      

      *输入 /usr/local/ssl/lib 并保存

      sudo ldconfig -v
      sudo nano /etc/environment
      

      *添加 ':/usr/local/ssl/bin' 到路径

      source /etc/environment
      echo $PATH
      

      *现在检查 openssl 版本

      openssl version -a 
      

      【讨论】:

        猜你喜欢
        • 2019-12-29
        • 1970-01-01
        • 2020-12-07
        • 2015-04-01
        • 2015-05-05
        • 2021-02-22
        • 2018-08-17
        • 1970-01-01
        相关资源
        最近更新 更多