这段代码
import requests
requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx")
出现了这个错误
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
我对 SSL 知之甚少,但我已尝试下载站点证书并使用 verify
选项指向该文件,但并未成功。我是漏掉了什么吗?
这段代码
import requests
requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx")
出现了这个错误
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
我对 SSL 知之甚少,但我已尝试下载站点证书并使用 verify
选项指向该文件,但并未成功。我是漏掉了什么吗?
正如评论中所指出的那样:从SSLLabs报告可以看出,该网站SSL实现存在问题。与您的问题相关的报告主要内容是:
该服务器的证书链不完整。级别被限制为B。
这意味着服务器没有发送完整的证书链以验证证书。这意味着您需要在验证时自己添加缺少的证书。为此,您需要将丢失的链证书C=US,O=DigiCert Inc,OU=www.digicert.com,CN=DigiCert SHA2 High Assurance Server CA和根CAC=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证书,因此将其添加到信任库中没有帮助。
verify=
参数。 - user85461cat institution-certificate.pem >> venv/lib/python3.9/site-packages/certifi/cacert.pem
似乎没有暗示使用certifi,所以我会向您展示我的解决方案:
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上找到了这个解决方案以及更多信息,点击这里查看。
如果可以避免证书验证(不安全),请将PYTHONHTTPSVERIFY环境变量设置为0:
export PYTHONHTTPSVERIFY=0
这将跳过证书验证。
requests
明显不是。 - redbeam_import requests
html = requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx",verify=False).text
你应该这样写,我已经验证过了