报废:SSL:http://en.wikipedia.org的CERTIFICATE_VERIFY_FAILED错误


123

我正在练习“使用Python进行网页搜刮”中的代码,但始终遇到此证书问题:

from urllib.request import urlopen 
from bs4 import BeautifulSoup 
import re

pages = set()
def getLinks(pageUrl):
    global pages
    html = urlopen("http://en.wikipedia.org"+pageUrl)
    bsObj = BeautifulSoup(html)
    for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):
        if 'href' in link.attrs:
            if link.attrs['href'] not in pages:
                #We have encountered a new page
                newPage = link.attrs['href'] 
                print(newPage) 
                pages.add(newPage) 
                getLinks(newPage)
getLinks("")

错误是:

  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 1319, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1049)>

顺便说一句,我也正在练习scrapy,但是不断出现问题:找不到命令:scrapy(我在线尝试了各种解决方案,但是没有一个……非常令人沮丧)


1
urllib.error.URLError:<urlopen错误[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:无法获取本地颁发者证书(_ssl.c:1049)>
Catherine4j

1
还有...请告诉我这个错误的原因,真的很想知道~~谢谢!
Catherine4j

1
SSL上529个现有问题:CERTIFICATE_VERIFY_FAILED,请找出您的解决方案,然后将其重复。
smci


我要评论一个显而易见的事实:您是否使用https而不是http进行访问?
smci

Answers:


436

从前,我偶然发现了这个问题。如果您使用的是macOS,请转至Macintosh HD>应用程序> Python3.6文件夹(或您使用的任何版本的python)>双击“ Install Certificates.command”文件。:D


5
哦,我的Mac上没有安装Installs Certificates.command文件...不知道为什么使用TAT
Catherine4j

24
如果使用Homebrew安装Python,则该文件不存在。解决方案在这里:stackoverflow.com/a/44649450/412896
Sampo

4
有人请将其标记为解决该问题的答案。当我陷入困境时,您为我节省了很多时间和精力!
Mark Puchala II

5
对于Windows 10我该如何做?没有这样的文件。
Aakash Basu

6
传奇答案
Nico

43

要使用未经验证的ssl,可以将其添加到代码中:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

2
这很好,因为如果我需要添加的只是两行代码,为什么我必须进行系统更改。
纳格里

1
这个答案也许应该提到的是它刮掉此代码后可能会引入巨大的安全问题取决于用户与数据做什么..
迈克尔Altfield

确保当您使用未经验证的证书时,您将面临风险。仅当您知道什么是数据源并且不适用于生产模式将其设置为默认数据源时,此行代码才有用。问题是关于如何裁剪一些未经验证的页面,至少在这种情况下,此代码不会引起很大的安全问题。
Rambod

1
这是一个简单的解决方法。谢谢。
罗伊

30

要解决这个问题:

您需要做的就是安装Python证书!macOS上的常见问题。

打开这些文件:

Install Certificates.command
Update Shell Profile.command

只需运行这两个脚本,您将不再有此问题。

希望这可以帮助!


8
我在应用程序目录中看不到Python目录。我正在使用Anaconda并为python 3.6创建了一个新的env,因为我以前安装了python 2.7(显然也没有在我的应用程序目录中创建文件夹!)。 ..在我的Mac上找不到Certificates.command
Kai

3
这些应该从哪里运行?
baxx

1
@Azim:在Ubuntu中怎么样?
贝蒂


17

对于新手用户,您可以进入Applications文件夹并展开Python 3.7文件夹。现在,首先运行(或双击)Install Certificates.command,然后运行Update Shell Profile.command

在此处输入图片说明



5

对于使用anaconda的任何人,您都可以安装该certifi软件包,请参见以下内容:

https://anaconda.org/anaconda/certifi

要安装,请在终端中输入以下行:

conda install -c anaconda certifi

我也遇到了这个问题。无法创建环境。我刚刚安装了miniconda3(macOS),并且看到已安装证书(“ conda列表”)。–
Kai



2

不幸的是,我没有解决问题。但是设法使代码起作用(几乎所有我的代码都具有这个问题),在python3.7下发生了本地发行者证书问题,因此我改回了python2.7 QAQ,并且所有需要更改的内容都包括“从urllib2 import urlopen”而不是“从urllib.request导入urlopen”,所以很难过...


2

如果您在Mac上运行,则可以Install Certificates.command在聚光灯下搜索并按Enter。


0

使用请求库。尝试此解决方案,或仅https://在URL之前添加:

import requests
from bs4 import BeautifulSoup
import re

pages = set()
def getLinks(pageUrl):
    global pages
    html = requests.get("http://en.wikipedia.org"+pageUrl, verify=False).text
    bsObj = BeautifulSoup(html)
    for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):
        if 'href' in link.attrs:
            if link.attrs['href'] not in pages:
                #We have encountered a new page
                newPage = link.attrs['href']
                print(newPage)
                pages.add(newPage)
                getLinks(newPage)
getLinks("")

检查是否适合您


0

与Stack Overflow的所有专家相比,我是一个相对新手。

我有2个版本的jupyter笔记本正在运行(一个通过全新的Anaconda Navigator安装,另一个通过????)。我认为这是因为Anaconda是作为Mac上的本地安装安装的(按照Anaconda的说明)。

我已经安装了python 3.7。之后,我使用终端打开jupyter笔记本,我认为这会在Mac上全局发布另一个版本。

但是,我不确定,因为我只是通过反复试验来学习!

我做了终端命令:

conda install -c anaconda certifi 

(如上指示,但是没有用。)

我的python 3.7安装在OS Catalina10.15.3中:

  • /Library/Python/3.7/site-packages AND
  • 〜/ Library / Python / 3.7 / lib / python / site-packages

证书位于:

  • 〜/ Library / Python / 3.7 / lib / python / site-packages / certifi-2019.11.28.dist-info

我试图找到Install Certificate.command ...,但是通过浏览文件结构找不到它...不在应用程序中...不在上面的链接中。

我最终通过在Spotlight中找到它进行了安装(如上面的建议)。它自动双击并在与以下文件夹相同的文件夹中安装了另一个证书:

  • 〜/ Library / Python / 3.7 / lib / python / site-packages /

以上都不对我有任何帮助...我仍然遇到相同的错误。

因此,我通过以下方法解决了该问题:

  1. 关闭我的jupyter笔记本。
  2. 打开Anaconda Navigator。
  3. 通过Navigator GUI(而不是通过Terminal)打开jupyter笔记本。
  4. 打开我的笔记本并运行代码。

我不能告诉你这为什么起作用。但这为我解决了问题。

我只想下次节省别人的麻烦。如果有人能告诉我它为什么起作用,那将是非常棒的。

我没有尝试其他终端命令,因为我知道这是一个问题的2版本的jupyter notebook。我只是不知道该如何解决。


0

对我来说,问题在于我正在设置REQUESTS_CA_BUNDLE自己的.bash_profile

/Users/westonagreene/.bash_profile:
...
export REQUESTS_CA_BUNDLE=/usr/local/etc/openssl/cert.pem
...

一旦我设为REQUESTS_CA_BUNDLE空白(即从中删除.bash_profile),请requests再次工作。

export REQUESTS_CA_BUNDLE=""

该问题仅在requests通过CLI(命令行界面)执行python时出现。如果我运行,requests.get(URL, CERT)它就解决了。

Mac OS Catalina(10.15.6)。3.6.11的Pyenv。我收到的错误消息:[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)

我在其他地方的答案:https : //stackoverflow.com/a/64151964/4420657


0

我正在使用Debian 10 buster并尝试使用youtube-dl下载文件并收到此错误: sudo youtube-dl -k https://youtu.be/uscis0CnDjk

[youtube] uscis0CnDjk:正在下载网页错误:无法下载网页:<urlopen错误[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:无法获取本地发行者证书(_ssl.c:1056)>(由URLError(SSLCertVerificationError(1,' [SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:无法获取本地发行者证书(_ssl.c:1056)')))

正确安装了python2和python3.8的证书,但是我永久收到相同的错误。最终(这不是最好的解决方案,但对我有用的是取消证书检查,因为它是youtube-dl中的一个选项) sudo youtube-dl -k --no-check-certificate https://youtu.be/uscis0CnDjk



-1

这会起作用。将环境变量PYTHONHTTPSVERIFY设置为0。

  • 通过输入linux命令:
export PYTHONHTTPSVERIFY = 0

要么

  • 在python代码中使用:
import os
os.environ["PYTHONHTTPSVERIFY"] = "0"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.