为什么我收到 'unable to get local issuer certificate (_ssl.c:997)'

Why do I receive 'unable to get local issuer certificate (_ssl.c:997)'

向特定 URL 发送请求时,我收到 SSL 错误,我不确定原因。首先请查看我收到的错误消息:

requests.exceptions.SSLError: HTTPSConnectionPool(host='dicmedia.korean.go.kr', port=443): Max retries exceeded with url: /multimedia/naver/2016/40000/35000/14470_byeon-gyeong.wav (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)')))

最近两天我搜索了不同的 Whosebug 问题,但没有成功:

我已经试过了:

老实说,我不知道为什么会收到此错误。由于错误消息本身表明有问题的服务器似乎可以以某种方式获取我的本地证书。该脚本一直工作到一周前。在那之前我没有更新Python。我现在用的是官网下载的python3.10.2

我不想设置 verify=False,因为这只会跳过验证过程,让我容易受到攻击,因为许多人已经在不同的问题上指出了这一点。除此之外,我真的很困扰我无法解决错误。

非常感谢任何帮助。具体要求见:

import requests

def request(url):
    response = requests.get(url, verify="/private/etc/ssl/certs")
    print(response)

request("https://dicmedia.korean.go.kr/multimedia/naver/2016/40000/35000/14470_byeon- 
gyeong.wav")

经过大量谷歌搜索后,我自己找到了解决方案:

问题 - 看起来 - 并不是所有需要的证书都包含在 Python cacert.pem 文件中。正如我在上面的问题中指出的那样,为了解决这个问题,我首先下载了 certifi 模块。由于这也没有解决,我想 certifi 也错过了必要的证书。

但是 我想证书中并非所有证书都丢失了。正如对类似 的回答所指出的,大部分缺少的不是整个链,而只是中间证书。

之后:

1. 下载必要的证书(查看浏览器中的锁定符号;如果您在 OSX 上,则需要拖放大图像取景器或桌面等的证书),

2. converting.perm 文件并将它们捆绑在一起:cat first_cert.pem second_cert.pem > combined_cert.pem

3. 提供捆绑证书的具体路径,如我的问题所示:verify="private/etc/ssl/certs(您当然可以选择不同的文件路径)。

服务器接受了我的请求。

我想我尝试这个解决方案时的错误是我一开始没有下载整个链,而是只下载了最后一个证书。

我真的希望这可以帮助其他人作为参考。

尽管如此,我仍然非常想知道为什么首先会出现错误。我根本没有更改我的脚本并定期使用它,但突然出现了上述错误。是我尝试访问的服务器更改其证书的原因吗?

如果我的术语不正确,请见谅。