Python请求SSL错误-证书验证失败

7fyelxc5  于 2022-11-30  发布在  Python
关注(0)|答案(5)|浏览(331)

此代码

import requests
requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx")

给我这个错误

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)

我对SSL几乎一无所知,但我试过下载网站的证书并使用verify选项指向该文件,但没有成功。我是否遗漏了什么?

omtl5h9j

omtl5h9j1#

正如已经在评论中指出的:该站点的SSL实现不正确,这可以从SSLLabs report中看出。此报告中有关您的问题的主要部分是:
此服务器的证书链不完整。等级上限为B。
这意味着服务器没有发送验证证书所需的完整证书链。这意味着您需要在验证时自己添加缺失的证书。为此,您需要将缺失链证书C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert SHA2 High Assurance Server CA的PEM以及根CA C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA的PEM信息包含在文件my_trust_store.pem中,然后您可以调用:

requests.get("https://...", verify='my_trust_store.pem')

...但我已尝试下载站点的证书并使用验证选项指向该文件
由于Python的SSL栈是基于OpenSSL的,而OpenSSL只需要信任库中的可信证书颁发机构(即,用verify给出),而服务器证书不是CA证书,因此将其添加到信任库中没有帮助。

dgiusagp

dgiusagp2#

cat institution-certificate.pem >> venv/lib/python3.9/site-packages/certifi/cacert.pem

如果您的网络需要CA,这应该可以解决问题

vktxenjb

vktxenjb3#

使用证书似乎并不意味着什么,所以我将向您展示我的解决方案是如何实现的:

import urllib, urllib2, ssl
import certifi

request = urllib2.Request(url=url)
kw = dict()
if url.startswith('https://'):
    certifi_context = ssl.create_default_context(cafile=certifi.where())
    kw.update(context=certifi_context)
urllib2.urlopen(request, **kw)

我在RealPython上找到了这个解决方案和更多信息,请点击这里

hivapdat

hivapdat4#

如果可以避免证书验证(不安全),请将PYTHONHTTPSVERIFY环境变量设置为0:

export PYTHONHTTPSVERIFY=0

这将跳过证书验证。

crcmnpdw

crcmnpdw5#

import requests
html = requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx",verify=False).text

"你应该这样写,我已经验证过了"

相关问题