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

证书验证失败:无法获取本地发行者证书

贺华容
2023-03-14

我正在尝试使用python从web获取数据。我导入了urllib。请求包,但在执行时,我得到错误:

certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)
  • 我正在Mac OS High Sierra上使用Python 3.7

当我将URL更改为“http”时,我能够获取数据。但是,我相信,这可以避免检查SSL证书。

因此,我在互联网上查找并找到了一个解决方案:运行/Applications/Python\3.7/Install\Certificates。命令

这解决了我的问题。但是我对SSL之类的东西一无所知。你能帮我理解它到底做了什么来解决我的问题吗。

如果可能,请向我推荐任何好的资源来了解安全性和证书。我是新来的。

谢谢

注意:我确实通过了链接-openssl,python请求错误:“证书验证失败”

我的问题不同于链接中的问题,因为我想知道当我安装认证包或运行安装\Certificates.command来修复错误时实际会发生什么。我对证券的理解很差。

共有3个答案

白泽语
2023-03-14

这适用于所有操作系统:

import ssl
import certifi

urlopen(request, context=ssl.create_default_context(cafile=certifi.where()))
罗星洲
2023-03-14

我在OSX上遇到了同样的问题,而我的代码在Linux上完全没问题,你在你的问题中给出了答案!

在检查了指向/Application/Python 3.7/Install Certificates.command的文件后,发现这个命令用通过认证包提供的根证书替换了默认Python安装的根证书。

是一组根证书。每个SSL证书都依赖一个信任链:您信任一个特定的证书,因为您信任该证书的父级,因此您信任该父级,等等。在某个时候,没有“父”,那些是“根”证书。对于这些,除了捆绑通常受信任的根证书(通常是像eg这样的大型信任公司)之外,没有其他解决方案。DigiCert)。

例如,您可以在浏览器安全设置(例如Firefox)中查看根证书-

回到最初的问题,在运行之前。命令file,执行此命令将为我返回一个干净安装的空列表:

import os
import ssl                                        
openssl_dir, openssl_cafile = os.path.split(      
    ssl.get_default_verify_paths().openssl_cafile)
# no content in this folder
os.listdir(openssl_dir)
# non existent file
print(os.path.exists(os.path.join(openssl_dir, openssl_cafile)))

这意味着OSX上的Python安装没有默认的证书颁发机构。一个可能的缺省值正是验证包提供的缺省值。

之后,您只需创建一个SSL上下文,该上下文具有如下正确的默认值(certifi.where()提供证书颁发机构的位置):

import platform
# ...

ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS)
ssl_context.verify_mode = ssl.CERT_REQUIRED
ssl_context.check_hostname = True
ssl_context.load_default_certs()

if platform.system().lower() == 'darwin':
    import certifi
    ssl_context.load_verify_locations(
        cafile=os.path.relpath(certifi.where()),
        capath=None,
        cadata=None)

并请求一个url从python像这样:

import urllib
# previous context
https_handler = urllib.request.HTTPSHandler(context=ssl_context)

opener = urllib.request.build_opener(https_handler)
ret = opener.open(url, timeout=2)

宇文良骏
2023-03-14

对于仍然想知道如何解决这个问题的人,我通过安装“Install Certificates.command”得到了我的答案

我是这样做的,

只要双击该文件,等待它安装,在我的情况下,您就可以开始了

 类似资料: