urllib和“SSL:CERTIFICATE_VERIFY_FAILED”错误
我得到这个错误
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。 我怎样才能绕过validation?
如果您只是想绕过validation,您可以创build一个新的SSLContext 。 默认情况下,新创build的上下文使用CERT_NONE 。
如第17.3.7.2.1节所述,小心这一点
直接调用SSLContext构造函数时,CERT_NONE是默认值。 由于它不authentication对方,所以它可能是不安全的,特别是在客户端模式下,大多数情况下,您希望确保您正在与之通话的服务器的真实性。 因此,在客户端模式下,强烈build议使用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]
因为你现在没有validation证书!
为了补充上面的内容,如果你想知道更多关于你为什么看到这些问题,你会想看看PEP 476 。
此PEPbuild议启用X509证书签名的validation,以及默认情况下Python的HTTP客户端的主机名validation,并且可以在每次调用的基础上select退出。 这个改变将被应用于Python 2.7,Python 3.4和Python 3.5。
有一个build议select退出,这是不符合我的build议上面:
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
它使用函数重写上下文创build的默认函数来创build未validation的上下文。
如果你想读一篇关于为什么不用软件validation证书是不好的你可以在这里find它 !
这不是解决您的具体问题,但我把它放在这里,因为这个线程是“SSL:CERTIFICATE_VERIFY_FAILED”的谷歌最高的结果,它导致我疯狂的追逐。
如果您在OSX上安装了Python 3.6并且在连接到https://站点时出现“SSL:CERTIFICATE_VERIFY_FAILED”错误,可能是因为OSX上的Python 3.6完全没有证书,并且无法validation任何SSL连接。 这是OSX上的3.6更改,并且需要一个安装后步骤,安装certifi
证书包。 这在自述文件中有logging,您应该在/Applications/Python\ 3.6/ReadMe.rtf
ReadMe将会运行这个安装后脚本, certifi
安装certifi
: /Applications/Python\ 3.6/Install\ Certificates.command
发行说明还有一些信息: https : //www.python.org/downloads/release/python-360/
在Windows上,Python不查看系统证书,它使用自己的位于?\lib\site-packages\certifi\cacert.pem
。
解决您的问题:
- 将域validation证书下载为* .crt或* pem文件
- 在编辑器中打开文件并将其内容复制到剪贴板
- find你的
cacert.pem
位置:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
- 编辑
cacert.pem
文件,并在文件末尾粘贴域validation证书。 - 保存文件并享受请求!
你可以尝试添加到你的环境variables:
PYTHONHTTPSVERIFY=0
就像我在评论中写的一样,这个问题可能与这个答案有关 。
简而言之:有多种方法来validation证书。 OpenSSL使用的validation与您系统上的可信根证书不兼容。 Python使用OpenSSL。
您可以尝试获取Verisign Class 3公共主authentication中心缺less的证书,然后根据Python文档使用cafile
选项:
urllib2.urlopen(req, cafile="verisign.pem")
为了扩大Craig Glennie的答案(对不起没有足够的声望评论):
在MacOs Sierra的Python 3.6.1中
input这个在bashterminal解决了这个问题:
pip install certifi /Applications/Python\ 3.6/Install\ Certificates.command
对于Centos 6/7上的Python 3.4+ ,Fedora ,只需按照以下方式安装受信任的CA:
- 将CA.crt复制到
/etc/pki/ca-trust/source/anchors/
-
update-ca-trust force-enable
-
update-ca-trust extract
import requests requests.packages.urllib3.disable_warnings() import ssl try: _create_unverified_https_context = ssl._create_unverified_context except AttributeError: # Legacy Python that doesn't verify HTTPS certificates by default pass else: # Handle target environment that doesn't support HTTPS verification ssl._create_default_https_context = _create_unverified_https_context
采取从这里https://gist.github.com/michaelrice/a6794a017e349fc65d01
像你一样,我在旧的iMac(OS X 10.6.8)上使用python 2.7,我也遇到了这个问题,使用urllib2.urlopen:
urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]
我的程序运行良好,没有SSL证书问题,突然(下载程序后),他们坠毁与此SSL错误。
问题是使用的python版本:
-
没有问题与https://www.python.org/downloads和python-2.7.9-macosx10.6.pkg
-
问题与由自制工具安装的一个:“brew install python”,版本位于/ usr / local / bin。
在/Applications/Python 2.7/ReadMe.rtf
,称为Certificate verification and OpenSSL [CHANGED for Python 2.7.9]
一章( Certificate verification and OpenSSL [CHANGED for Python 2.7.9]
/Applications/Python 2.7/ReadMe.rtf
解释了许多细节的问题。
所以,检查,下载并放入你的PATH正确的版本的Python。
尝试
pip安装–trusted-host pypi.python.org软件包名称
它为我工作。
我需要增加一个答案,因为就像克雷格·格兰尼(Craig Glennie)一样,由于许多post在网上提到这个问题,我进行了一场疯狂的追逐。
我正在使用MacPorts,而我原本以为是Python的问题实际上是一个MacPorts问题:它不会安装一个安装了openssl的根证书。 解决的办法就是port install curl-ca-bundle
,就像这篇博文中提到的那样。
因为我有同样的问题,所以我半开玩笑,只是在我的情况下,我打的URL是有效的,证书是有效的。 什么是无效的是我连接到networking。 我没有将代理详细信息添加到浏览器(在这种情况下是IE)。 这停止了validation过程的正确发生。
在代理细节中添加了我的python,然后非常高兴。
如果您在vCenter 6上,则应该将vCenter的vmware证书颁发机构证书添加到您的操作系统的受信任CA的列表中。 要下载您的证书,请执行以下操作
- 打开您的Web浏览器。
- 导航到https://
- 在右下angular,点击下载受信任的根CA链接
在Fedora上
- 解压并将扩展名从.0更改为.cer
- 把它复制到/ etc / pki / ca-trust / source / anchors /
- 运行update-ca-trust命令。
链接:
Python 2.7.12(默认,2016年7月29日,15:26:22)修复了上述问题。 这些信息可能会帮助别人。
看一眼
/ Applications / Python 3.6 /安装Certificates.command
你也可以去Aplications并点击Certificates.command
安装步骤nltk(我有python3(3.6.2)已经安装在MAC OS X中
sudo easy_install pip
使用忽略已安装的选项忽略卸载以前版本的六,否则,它会给出一个错误,同时卸载,并没有电影转发
sudo pip3 install -U nltk --ignore-installed six
检查pip和python的安装,使用'3'版本
which python python2 python3 which pip pip2 pip3
检查是否安装了NLTK
python3 import nltk nltk.__path__ ['/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk']
在安装示例书之前安装SSL证书,否则我们将在安装示例时发生证书错误
/Applications/Python\ 3.6/Install\ Certificates.command python3 -m nltk.downloader book
本书示例已经成功完成了nltk和nltk_ata的安装
ln -s /usr/local/share/certs/ca-root-nss.crt /etc/ssl/cert.pem
( FreeBSD 10.1
)