SSL:CERTIFICATE_VERIFY_FAILED与Python3

Paf*_*kes 45 python macos urllib python-3.x

如果这是一个愚蠢的问题我很抱歉,但我一直在努力教自己如何使用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)
Run Code Online (Sandbox Code Playgroud)

在处理上述异常期间,发生了另一个异常:

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

有人可以帮我弄清楚如何解决这个问题吗?

Bha*_*vik 63

转到安装Python的文件夹,例如,在我的情况下,它安装在Applications文件夹中,文件夹名称为"Python 3.6".现在双击"Install Certificates.command".之后错误消失了.

  • 代码的意义是什么 - 它适用了哪些变化 - 需要解释一下? (4认同)
  • 对于那些说找不到这个文件的人来说——这个解决方案只有苹果产品。 (3认同)

Jia*_*Jia 53

就我而言,我使用该ssl模块"解决"认证,如下所示:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context
Run Code Online (Sandbox Code Playgroud)

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

urllib.request.urlopen(urllink)
Run Code Online (Sandbox Code Playgroud)

  • 如何从 `urllib.request.urlopen(urllink)` 获取页面内容?换句话说,什么相当于“requests.get(MY_URL).content”? (3认同)
  • 很好的解决方案。工作并帮助我弄清楚首​​先发生了什么。 (2认同)

Dan*_*ers 22

在 Debian 9 上,我必须:

$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs
Run Code Online (Sandbox Code Playgroud)

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

  • 甚至可能不需要更新证书 - 就我而言,只需导出有效的路径即可。 (3认同)
  • 谢谢,手动安装 Python 3.8 后,我在 Raspbian Stretch 上遇到了同样的问题,并解决了设置该环境变量的问题。 (2认同)

del*_*ree 7

这在 ssl 库的最新版本中发生了变化。SSLContext 已移至其自己的属性。这相当于Jia在Python 3.8中的答案

import ssl

ssl.SSLContext.verify_mode = ssl.VerifyMode.CERT_OPTIONAL
Run Code Online (Sandbox Code Playgroud)


Adi*_*dil 6

作为解决方法(不安全),您可以通过将 PYTHONHTTPSVERIFY 环境变量设置为 0 来关闭证书验证:

export PYTHONHTTPSVERIFY=0
Run Code Online (Sandbox Code Playgroud)