urllib和“SSL:CERTIFICATE_VERIFY_FAILED”错误?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

我收到这个错误

Exception in thread Thread-3:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in        __bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in  run
self.__target(*self.__args, **self.__kwargs)
File "/Users/Matthew/Desktop/Skypebot 2.0/bot.py", line 271, in process
info = urllib2.urlopen(req).read()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open
response = self._open(req, data)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open
'_open', req)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open
context=self._context)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open
raise URLError(err)
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>

这是导致此错误的代码:

if input.startswith("!web"):
    input = input.replace("!web ", "")      
    url = "https://domainsearch.p.mashape.com/index.php?name=" + input
    req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXX' })
    info = urllib2.urlopen(req).read()
    Message.Chat.SendMessage ("" + info)

使用API​​ Im需要我使用https。我怎样才能让它绕过验证?

提问于
用户回答回答于

如果你只是想绕过验证,你可以创建一个新的SSLContext。默认情况下,新创建的上下文使用CERT_NONE。

如第17.3.7.2.1节所述,小心这一点

当直接调用SSLContext构造函数时,CERT_NONE是默认值。由于它不认证对方,所以它可能是不安全的,特别是在客户端模式下,大多数时候你想确保你正在与之通话的服务器的真实性。因此,在客户端模式下,强烈建议使用CERT_REQUIRED。

但是如果你只是想让它现在出于某种其他原因而工作,你可以做以下事情,你也必须import ssl

input = input.replace("!web ", "")      
url = "https://domainsearch.p.mashape.com/index.php?name=" + input
req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' })
gcontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1)  # Only for gangstars
info = urllib2.urlopen(req, context=gcontext).read()
Message.Chat.SendMessage ("" + info)

这应该避免你的问题,但你并没有真正解决任何问题,但你不会看到,[SSL: CERTIFICATE_VERIFY_FAILED]因为你现在没有验证证书!

为了补充上述内容,如果你想知道更多关于你为什么看到这些问题,你会想看看PEP 476。

此PEP建议默认启用X509证书签名的验证以及Python的HTTP客户端的主机名验证,但可以根据每次调用选择退出。此更改将应用​​于Python 2.7,Python 3.4和Python 3.5。

有人建议选择退出,这与我上面的建议不一样:

import ssl

# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)

它还具有通过monkeypatching 非常沮丧的选项,这在python中并不常见:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

它使用该函数重写上下文创建的默认函数以创建未验证的上下文。

用户回答回答于

这不是针对你的具体问题的解决方案,但是我将它放在此处,因为此线程是Google对SSL“CERTIFICATE_VERIFY_FAILED”的最高结果,它引导我进行大肆追逐。

如果你在OSX上安装了Python 3.6并且在尝试连接到https://站点时收到“SSL:CERTIFICATE_VERIFY_FAILED”错误,可能是因为OSX上的Python 3.6完全没有证书,并且无法验证任何SSL连接。这是对OSX 3.6的改变,并且需要一个安装certifi后证书的步骤。这在自述文件中有记录,你应该在这里找到它/Applications/Python\ 3.6/ReadMe.rtf

自述文件将让你运行这个安装后的脚本,它只是安装certifi/Applications/Python\ 3.6/Install\ Certificates.command

扫码关注云+社区