为什么我收到“无法获取本地颁发者证书 (_ssl.c:997)”

Mxn*_*gls 10 python openssl

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

requests.exceptions.SSLError: HTTPSConnectionPool(host='dicmedia.korean.go.kr', port=443): 超过最大重试次数,网址为:/multimedia/naver/2016/40000/35000/14470_byeon-gyeong.wav(由以下原因引起) SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:997)')))

我已经尝试过:

  • https://github.com/Unbabel/COMET/issues/29(这似乎与 Python 收到的有关使用特定 SSL 证书的内部更新有关(这里不是专家)
  • 下载有问题的证书并直接链接到它verify="private/etc/ssl/certs"

老实说,我不知道为什么会收到此错误。正如错误消息本身表明的那样,相关服务器似乎可以以某种方式获取我的本地证书。该脚本一直有效到一周前。在那之前我没有更新Python。现在我使用从官方网站下载的python 3.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")
Run Code Online (Sandbox Code Playgroud)

Mxn*_*gls 13

问题是 Python 的cacert.pem文件中并未包含所有所需的证书。为了解决这个问题,我首先下载了certifi模块。由于这效果不佳,我想certifi也错过了必要的证书。

但我想并不是证书中的所有证书都丢失了。正如类似问题的答案所表明的那样,大多数情况下缺少的不是整个链,而只是中间证书。

后:

1.下载必要的证书(请参阅浏览器中的锁定符号;如果您使用的是 OSX,则需要将证书的大图像拖放到查找器或桌面等位置),

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

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

我的请求被服务器接受了。

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

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

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

  • 我尝试了所有其他解决方案,这是唯一有效的解决方案。对于那些对证书一无所知的人,对于第 1 步,请搜索“如何下载 ssl 证书”,您将找到 YouTube 教程和有用的网站。下载您在那里找到的所有证书,而不仅仅是最后一个。在步骤2中,对于使用Windows的用户,可以使用openssl x509进行转换,然后使用“type”而不是“cat”来连接所有证书。 (2认同)

小智 7

我在 MAC 操作系统上遇到了同样的问题。我的解决方案:问题出在我的 python 安装上。我转到该applications/ python文件夹​​并单击install certificate command它之后就修复了。