我在 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。
我没有运行任何代理。
我认为您有多个问题,因为 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/)。
openssl s_client -showcerts -connect sha256.badssl.com:443 < /dev/null > certificate
提供2个证书,请求需要另一个:'ISRG Root X1' 要在 Firefox 上获得它,有这样的方法: 单击挂锁 点击查看证书 点击PEM(证书) 我没有找到如何使用 openssl 获取它。 如果有人知道怎么做那将会有帮助 单击挂锁 点击查看证书 点击PEM(证书) 我没有找到如何使用 openssl 获取它。 如果有人知道怎么做那将会有帮助