【问题标题】:SSL: CERTIFICATE_VERIFY_FAILED with urllibSSL:带有 urllib 的 CERTIFICATE_VERIFY_FAILED
【发布时间】:2018-08-17 10:29:53
【问题描述】:

我遇到了模块 urllib (Python 3.6) 的问题。每次我使用该模块时,我都会得到一页的错误。

urllib 有什么问题以及如何解决?

import urllib.request
url='https://www.goodreads.com/quotes/tag/artificial-intelligence'
u1 = urllib.request.urlopen(url)
print(u1)

那段代码喜欢吐出这么多东西:

  Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 1318, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1239, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1285, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1234, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1026, in _send_output
    self.send(msg)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 964, in send
    self.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1400, in connect
    server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 407, in wrap_socket
    _context=self, _session=session)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 814, in __init__
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 1068, in do_handshake
    self._sslobj.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 689, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/a-nguyen/Downloads/EzSorses/APAsauce.py", line 3, in <module>
    u1 = urllib.request.urlopen(url)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 526, in open
    response = self._open(req, data)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 544, in _open
    '_open', req)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 504, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 1361, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 1320, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>

模块本身好像出了点问题。

【问题讨论】:

标签: python-3.x urllib


【解决方案1】:

你可以在 MacOsX 上运行一个命令行程序来安装证书:

sudo /Applications/Python\ 3.6/Install\ Certificates.command

sudo 命令将提示您输入密码以提升您的权限。

【讨论】:

    【解决方案2】:

    一个肮脏的(在安全方面不安全)但像这样快速的黑客可以为我完成这项工作:

    import ssl
    
    ssl._create_default_https_context = ssl._create_unverified_context
    

    【讨论】:

    • 这是极其危险的,因为它会在不知不觉中影响所有下游用户。永远不应该这样做。至少创建和使用未经验证的上下文,而不是 urlopen(url, context=ssl.SSLContext()
    【解决方案3】:

    我遇到了同样的问题。我的 python 版本是 3.6.5,我在 Mac OSX 上。当我尝试连接到 HTTPS 网站时,我开始获得

    &lt;urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)&gt;

    异常。所以,对我来说很明显,我机器上的 python 没有证书。我刚刚从路径/Applications/Python 3.6 运行文件,文件名为安装Certificates.command。这解决了我的问题。 我参考了这个post

    【讨论】:

    • 这解决了 Python 3.6 上的问题。在此处查看相关问题:bugs.python.org/issue28150
    • 这是在 linux rhel 上的什么地方?
    【解决方案4】:

    要解决这个问题,打开你的 bash 并写下:

    cd /Applications/Python 3.6
    

    然后:

    sudo Certificates.command
    

    【讨论】:

    猜你喜欢
    • 2020-12-07
    • 2015-04-01
    • 2015-05-05
    • 2021-02-22
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多