我收到以下错误:
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要求我使用HTTPS。如何使其绕过验证?
如果只想绕过验证,则可以创建一个新的SSLContext。默认情况下,新创建的上下文使用CERT_NONE。
SSLContext
CERT_NONE
请注意第17.3.7.2.1节中的规定
直接调用SSLContext构造函数时,默认值为CERT_NONE。由于它不对另一个对等方进行身份验证,因此它可能是不安全的,尤其是在客户端模式下,在大多数情况下,你希望确保与之对话的服务器的真实性。因此,在客户端模式下,强烈建议使用CERT_REQUIRED。
CERT_REQUIRED
但是,如果你只是希望它由于其他原因而现在可以工作,则可以执行以下操作,则还必须这样import ssl做:
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() # 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
它将使用创建未验证上下文的功能覆盖用于上下文创建的默认功能。
请注意,如PEP中所述:
本指南主要针对希望采用较新版本的Python的系统管理员,这些版本的Python在尚不支持HTTPS连接证书验证的传统环境中实现此PEP。例如,管理员可以通过在其Python标准操作环境中将上述Monkeypatch添加到sitecustomize.py中来选择退出。应用程序和库不应在整个更改过程中进行更改(除非响应系统管理员控制的配置设置)。
356
这不是解决你的特定问题的方法,但我将其放在此处,因为该线程是“ SSL:CERTIFICATE_VERIFY_FAILED”在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
SSL:CERTIFICATE_VERIFY_FAILED”
/Applications/Python\ 3.6/ReadMe.rtf
自述文件将让你运行以下安装后脚本,该脚本将进行安装certifi:/Applications/Python\ 3.6/Install\ Certificates.command
certifi:/Applications/Python\ 3.6/Install\ Certificates.command