当前位置: 首页 > 知识库问答 >
问题:

urllib和"SSL:CERTIFICATE_VERIFY_FAILED"错误

翁硕
2023-03-14

我得到以下错误:

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。我怎样才能让它绕过验证?

共有3个答案

皇甫德庸
2023-03-14

要扩展Craig Glennie的答案:

在Python 3.6中。马科斯山脉1号

在bash终端中输入此选项解决了问题:

pip install certifi
/Applications/Python\ 3.6/Install\ Certificates.command
隆长卿
2023-03-14

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

如第17.3节所述,注意这一点。7.2.1.

直接调用SSLContext构造函数时,默认CERT_NONE。由于它不会对另一个对等体进行身份验证,因此可能不安全,尤其是在客户端模式下,在这种模式下,大多数时候您希望确保与您交谈的服务器的真实性。因此,在客户端模式下,强烈建议使用CERT_REQUIRED。

但是,如果您只是想让它现在工作,因为其他原因,您可以执行以下操作,您也必须导入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)

它还具有一个非常不鼓励的选项,通过monkeypatch,你不经常在python中看到:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

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

请注意,如政治公众人物中所述:

本指南主要针对希望采用较新版本的Python的系统管理员,这些Python在尚未支持HTTPS连接上的证书验证的遗留环境中实现此PEP。例如,管理员可以通过将上面的monkeypatch添加到sitecustomize来选择退出。py在Python的标准操作环境中。应用程序和库不应在整个更改过程中进行更改(除非可能是响应系统管理员控制的配置设置)。

如果你想阅读一篇关于为什么不验证证书在软件中不好的文章,你可以在这里找到它!

丁沛
2023-03-14

这不是你特定问题的解决方案,但我把它放在这里是因为这个线程是“SSL:CERTIFICATE_VERIFY_FAILED”的谷歌顶级结果,它让我徒劳无功。

如果您已经在OSX上安装了Python 3.6,并且在尝试连接到https://站点时出现“SSL:CERTIFICATE\u VERIFY\u FAILED”错误,可能是因为OSX上的Python 3.6根本没有证书,并且无法验证任何SSL连接。这是对OSX上3.6的更改,需要安装后步骤,该步骤将安装certifi证书包。这在自述文件中有记录。rtf,您可以在/Applications/Python\3.6/ReadMe上找到它。rtf(另请参见文件consultion.rtf和生成macOS安装程序的脚本build installer.py)。

ReadMe会让你运行安装后脚本/Application/Python\3.6/Install\Certificates.command(它的源代码install_certificates.command),它:

  • 首先安装Python包certifi,然后
  • 然后创建一个从OpenSSL证书文件到由包certifi安装的证书文件的符号链接

发行说明有更多信息:https://www.python.org/downloads/release/python-360/

在较新版本的Python上,有更多关于这方面的文档:

  • https://github.com/python/cpython/blob/e05a703848473b0365886dcc593cbddc46609f29/Mac/BuildScript/resources/ReadMe.rtf#L22-L34
  • https://github.com/python/cpython/blob/e05a703848473b0365886dcc593cbddc46609f29/Mac/BuildScript/resources/Conclusion.rtf#L15-L19
  • https://github.com/python/cpython/blob/e05a703848473b0365886dcc593cbddc46609f29/Mac/BuildScript/resources/Welcome.rtf#L23-L25
  • https://github.com/python/cpython/blob/e05a703848473b0365886dcc593cbddc46609f29/Mac/BuildScript/resources/install_certificates.command
  • https://github.com/python/cpython/blob/e05a703848473b0365886dcc593cbddc46609f29/Mac/BuildScript/README.rst
  • https://github.com/python/cpython/blob/e05a703848473b0365886dcc593cbddc46609f29/Mac/BuildScript/build-installer.py#L239-L246
 类似资料:
  • 问题内容: 我收到以下错误: 这是导致此错误的代码: 我使用的API要求我使用HTTPS。如何使其绕过验证? 问题答案: 如果只想绕过验证,则可以创建一个新的。默认情况下,新创建的上下文使用。 请注意第17.3.7.2.1节中的规定 直接调用构造函数时,默认值为。由于它不对另一个对等方进行身份验证,因此它可能是不安全的,尤其是在客户端模式下,在大多数情况下,你希望确保与之对话的服务器的真实性。因此

  • 我本来想解决[SSL:CERTIFICATE\u VERIFY\u FAILED]问题,因为我使用mac和python 3,很多人说我应该运行/Applications/python\3.6/Install\Certificates。命令 但是在我运行证书之后。命令,我似乎不工作,终端告诉我很多错误 [SSL:CERTIFICATE_VERIFY_FAILED]的问题没有解决,我怀疑可能是证书没有

  • 问题内容: 我正在尝试使用urllib从ftp普查站点下载一个zip文件(“ tl_2008_01001_edges.zip”)。压缩文件以什么格式保存,如何保存? 我对Python还是很陌生,不了解urllib是如何工作的。 这是我的尝试: 如果我知道ftp文件夹列表(在这种情况下为县),是否可以使用glob函数浏览ftp站点列表? 谢谢。 问题答案: 使用的zip文件数据 和 目录列表。 要使

  • 大约一到两周前,我就无法使用pip,因为它总是会回退以下错误: 错误:由于环境原因无法安装程序包错误:HTTPSConnectionPool(host='files.pythonhosted.org',port=443):url超过最大重试次数:/packages/1b/e5/552ba6583ab43e12b299458fea94ee23886125b8b8babc91edb03f2ba65/p

  • 我正在尝试搜索亚马逊的产品广告,并使用botlenose来帮助我做到这一点。但是,我刚刚收到HTTP错误400。 其他一些重要信息: 我来自巴西,我的标签也来自亚马逊。这是个问题吗? 我确实检查了我的钥匙、秘密和标签,一切正常。我确实在StackOverflow上查看了其他一些问题,但对我来说没有任何效果。 当然,出于安全原因,我更改了密钥。 Traceback(最近一次调用最后一次):File"