我正在尝试使用python从web获取数据。我导入了urllib。请求包,但在执行时,我得到错误:
certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)
当我将URL更改为“http”时,我能够获取数据。但是,我相信,这可以避免检查SSL证书。
因此,我在互联网上查找并找到了一个解决方案:运行/Applications/Python\3.7/Install\Certificates。命令
这解决了我的问题。但是我对SSL之类的东西一无所知。你能帮我理解它到底做了什么来解决我的问题吗。
如果可能,请向我推荐任何好的资源来了解安全性和证书。我是新来的。
谢谢
注意:我确实通过了链接-openssl,python请求错误:“证书验证失败”
我的问题不同于链接中的问题,因为我想知道当我安装认证
包或运行安装\Certificates.command
来修复错误时实际会发生什么。我对证券的理解很差。
这适用于所有操作系统:
import ssl
import certifi
urlopen(request, context=ssl.create_default_context(cafile=certifi.where()))
我在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)
对于仍然想知道如何解决这个问题的人,我通过安装“Install Certificates.command
”得到了我的答案
我是这样做的,
只要双击该文件,等待它安装,在我的情况下,您就可以开始了
您好,我在构建python映像时遇到问题 错误说, 但是当升级pip时,同样的错误显示。 错误:由于环境原因无法安装程序包错误:HTTPSConnectionPool(host='files.pythonhosted.org',port=443):url超过最大重试次数:/packages/ac/cf/0cc542fc93de2f3b9b53cb979c7d118cffb93204afb4629a
Rails/Ruby/OpenSSL不允许我发送电子邮件,为什么? 控制台中的测试: 结果错误: “SSL\u connect返回=1 errno=0 state=错误:证书验证失败(无法获取本地颁发者证书)(OpenSSL::SSL::SSLError)” 我的证书路径: 我的环境: 铁轨6.1.4.1 红宝石3.0.1p64 OpenSSL 1.1.1f 编辑:这将建立工作连接:
我正在使用Py魅力和python 3.8和最新版本的不和谐。我试图运行这个脚本,但得到了这个错误。有人能帮忙吗? -------以下------ 错误 /Users/mellie/PycharmProjects/Dominations/venv/bin/python/Users/mellie/PycharmProjects/Domi。py回溯(最后一次调用):文件“/Users/mellie/Py
我正在Windows7上运行PHP版本5.6.3作为XAMPP的一部分。 当我尝试使用Mandrill API时,我得到以下错误: 未捕获异常“Mandrill_HttpError”,消息为“API调用消息/send-template失败:SSL证书问题:无法获取本地颁发者证书” 我已经尝试了在StackOverflow上读到的所有内容,包括向php.ini文件添加以下内容: 当然可以从http:
问题内容: 我正在Windows 7上将PHP版本5.6.3作为XAMPP的一部分运行。 当我尝试使用Mandrill API时,出现以下错误: 消息“ API调用消息/发送模板失败”的未捕获异常“ Mandrill_HttpError”:SSL证书问题:无法获取本地颁发者证书 我已经尝试了我在StackOverflow上阅读的所有内容,包括将以下内容添加到php.ini文件中: 当然,还可以从h
错误 ssl。SSLCertVerificationError:[SSL:证书\u验证\u失败]证书验证失败:无法获取本地颁发者证书(\u SSL.c:1056)验证证书时SSL握手失败 哎呀。客户例外。ClientConnectorCertificateError:无法连接到主机discordapp。com:443 ssl:True[SSLCertVerificationError:(1),[s