SSL:CERTIFICATE_VERIFY_FAILED”错误->即使在安装证书后也是如此

问题描述

首先:我已经从this thread阅读了两页有关同一错误消息的答案。

我还不能修复它!我已经(重新)安装了证书,但是每当我尝试从某个网站导入CSV文件时,它始终会返回此错误

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_Failed] certificate verify Failed: unable to get local issuer certificate (_ssl.c:1123)>

因此,除了创建不验证证书的解决方法之外,并且鉴于我已经在macOS上安装了证书,我还能尝试做些什么来解决它?

解决方法

您的Python版本和操作系统是什么?

此错误表示您的Python应用无法加载签署服务器证书的CA证书。

有两种情况:

  1. 该网站由未知的CA签名。然后,您需要获取该CA的证书并安装到系统中。要测试此问题,请尝试将您的应用程序连接到知名站点。例如。 stackoverflow.com。如果可行,则将加载系统证书,并且仅缺少服务器CA的证书。

  2. 如果您的应用无法验证知名应用的证书,则表示启动时未加载任何CA证书。您应该手动加载它们。

要在Python中加载CA证书,请使用SSLContext.load_verify_locations方法。

更新

万恶之源

在Firefox中打开站点https://www.cryptodatadownload.com/。并以错误为核心原因错误代码:SEC_ERROR_UNKNOWN_ISSUER

享受安全威胁页面

问题是该站点的证书由Mozilla CA Store中未包含的GeoTrust RSA证书签名。为什么选择Mozilla?因为它是CA证书存储,所以被许多开源项目使用。

额外的一层复杂性:从Python 3.8开始,它不再使用Mac OS的证书。您需要手动加载CA证书。

解决方案

最简单的方法是使用浏览器为目标站点提取CA证书,并在urlopen调用或SSL上下文构造中加载它们。

Here is具有https://www.cryptodatadownload.com/的CA证书链的文件。我是在Windows上使用Chrome构建的。

将其保存为名称geotrust.cer,然后尝试以下代码段:

import urllib.request as request

request.urlopen("https://www.cryptodatadownload.com/",cafile="geotrust.cer")

在我的python 3.6上,它工作正常。

更棘手的路径是将这两个证书添加到Python安装的CA路径中,但这非常依赖于平台。我不能告诉你Mac OS的收据