此代码
import requests requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx")
给我这个错误
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
我对SSL几乎一无所知,但我试过下载网站的证书并使用verify选项指向该文件,但没有成功。我是否遗漏了什么?
verify
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中,然后您可以调用:
my_trust_store.pem
requests.get("https://...", verify='my_trust_store.pem')
...但我已尝试下载站点的证书并使用验证选项指向该文件由于Python的SSL栈是基于OpenSSL的,而OpenSSL只需要信任库中的可信证书颁发机构(即,用verify给出),而服务器证书不是CA证书,因此将其添加到信任库中没有帮助。
dgiusagp2#
cat institution-certificate.pem >> venv/lib/python3.9/site-packages/certifi/cacert.pem
如果您的网络需要CA,这应该可以解决问题
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上找到了这个解决方案和更多信息,请点击这里
hivapdat4#
如果可以避免证书验证(不安全),请将PYTHONHTTPSVERIFY环境变量设置为0:
export PYTHONHTTPSVERIFY=0
这将跳过证书验证。
crcmnpdw5#
import requests html = requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx",verify=False).text
"你应该这样写,我已经验证过了"
5条答案
按热度按时间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
中,然后您可以调用:...但我已尝试下载站点的证书并使用验证选项指向该文件
由于Python的SSL栈是基于OpenSSL的,而OpenSSL只需要信任库中的可信证书颁发机构(即,用
verify
给出),而服务器证书不是CA证书,因此将其添加到信任库中没有帮助。dgiusagp2#
如果您的网络需要CA,这应该可以解决问题
vktxenjb3#
使用证书似乎并不意味着什么,所以我将向您展示我的解决方案是如何实现的:
我在RealPython上找到了这个解决方案和更多信息,请点击这里
hivapdat4#
如果可以避免证书验证(不安全),请将PYTHONHTTPSVERIFY环境变量设置为0:
这将跳过证书验证。
crcmnpdw5#
"你应该这样写,我已经验证过了"