证书验证失败:无法获取本地颁发者证书似乎没有任何问题

问题描述 投票:0回答:2

我在 python 中使用请求,但出现错误

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

这是我的代码:

import requests

url = 'https://sha256.badssl.com'

cert_path = 'certificate.pem'

response = requests.get(url, verify=cert_path)

文件certificate.pem包含 -----开始证书----- ... -----证书结束----- 结果

openssl s_client -connect sha256.badssl.com:443

certificate.pem 与我的 main.py 位于同一目录中。

我尝试使用绝对路径。

我尝试了 3.10.12 和 3.12.2

我已经看过文档和同一个问题这里

我尝试使用另一个 wifi。

我没有运行任何代理。

python ssl python-requests
2个回答
0
投票

我认为您有多个问题,因为 https://badssl.com 具有有效的证书,因此您不应该收到该 URL 的证书错误。这表明您缺少受信任的证书颁发机构的基本列表。

也就是说,让我们仔细看看这个问题。

如果您通过执行以下操作来获取服务器证书:

openssl s_client -connect sha256.badssl.com:443 < /dev/null > certificate

然后您将获得一个证书:

$ grep BEGIN certificate
-----BEGIN CERTIFICATE-----

该证书不是自签名证书:

$ openssl x509 -in certificate -noout -subject -issuer certificate
subject=CN = *.badssl.com
issuer=C = US, O = Let's Encrypt, CN = R3

这意味着在

verify
requests.get
参数中使用它没有任何意义;您需要发行人的证书。您可能需要的不仅仅是,当使用
openssl s_client
获取远程证书时,您需要提供
-showcerts
选项,该选项将显示服务器发送的整个证书链:

openssl s_client -showcerts -connect sha256.badssl.com:443 < /dev/null > certificate

现在你会发现我们有多个证书:

$ grep BEGIN certificate
-----BEGIN CERTIFICATE-----
-----BEGIN CERTIFICATE-----

第一个证书是我们已经看到的,但第二个证书用于:

subject=C = US, O = Let's Encrypt, CN = R3
issuer=C = US, O = Internet Security Research Group, CN = ISRG Root X1

如果我们使用这个新文件作为我们的 CA 捆绑包,它会按预期工作:

>>> import requests
>>> requests.get('https://badssl.com/', verify='certificate')
<Response [200]>

值得注意的是,远程服务器提供的证书链可能不包含根证书。在这种情况下,您需要直接从证书颁发机构获取根证书(例如 Let's Encrypt 的 https://letsencrypt.org/certificates/)。


0
投票
openssl s_client -showcerts -connect sha256.badssl.com:443 < /dev/null > certificate

提供2个证书,请求需要另一个:'ISRG Root X1' 要在 Firefox 上获得它,有这样的方法: 单击挂锁 点击查看证书 点击PEM(证书) 我没有找到如何使用 openssl 获取它。 如果有人知道怎么做那将会有帮助 单击挂锁 点击查看证书 点击PEM(证书) 我没有找到如何使用 openssl 获取它。 如果有人知道怎么做那将会有帮助

© www.soinside.com 2019 - 2024. All rights reserved.