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

解决您的问题:

  1. 将域validation证书下载为* .crt或* pem文件
  2. 在编辑器中打开文件并将其内容复制到剪贴板
  3. 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)
  4. 编辑cacert.pem文件,并在文件末尾粘贴域validation证书。
  5. 保存文件并享受请求!

你可以尝试添加到你的环境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:

  1. 将CA.crt复制到/etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. 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版本:

  1. 没有问题与https://www.python.org/downloads和python-2.7.9-macosx10.6.pkg

  2. 问题与由自制工具安装的一个:“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的列表中。 要下载您的证书,请执行以下操作

  1. 打开您的Web浏览器。
  2. 导航到https://
  3. 在右下angular,点击下载受信任的根CA链接

在Fedora上

  1. 解压并将扩展名从.0更改为.cer
  2. 把它复制到/ etc / pki / ca-trust / source / anchors /
  3. 运行update-ca-trust命令。

链接:

  1. https://virtualizationreview.com/articles/2015/04/02/install-root-self-signed-certificate-vcenter-6.aspx?m=1
  2. http://forums.fedoraforum.org/showthread.php?t=293856

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