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

问题描述:

此代码Python的请求SSL错误 - 证书验证失败

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

是给我这个错误

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

我知道几乎一无所知SSL,但我已经尝试下载该网站的证书和指点该文件使用verify选项,但它没有奏效。我错过了什么吗?

+0

您正在使用哪种版本的Python和操作系统? – Alasdair

+0

对不起,Python 3.6.3和Windows 7 – Oliver

+2

该网站有一个不好的SSL实施:https://www.ssllabs.com/ssltest/analyze.html?d=hcaidcs.phe.org.uk –

正如已经在评论中指出:该网站有这可从SSLLabs report可以看到一个坏的SSL实现。本报告关于您的问题的主要部分是:

此服务器的证书链不完整。等级上限为B.

这意味着服务器不会根据验证证书所需发送完整证书链。这意味着您需要在验证时自己添加缺少的证书。为此,您需要包括PEM失踪链证书C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert SHA2 High Assurance Server CA,也为根CA C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA信息文件my_trust_store.pem然后你可以拨打:

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

...但我已经试过下载网站的证书并使用验证选项指向该文件

这不适用于正常的叶证书。由于Python的SSL堆栈基于OpenSSL,并且OpenSSL只需要信任存储区中的可信证书颁发机构(即,使用verify给出)并且服务器证书不是CA证书,它将无助于将其添加到信任存储区。

+0

这解决了我的问题,非常感谢你的解释。 – Oliver

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

你应该写这样的,我已经验证它

+0

如果你想从提问者处获得更多信息,请使用评论。只是蓝色镜头的答案可能会被降低。 –

+0

这只是禁用任何种类的证书验证。这应该只用于测试,但从不在生产中,因为它会在中间人攻击中向人打开应用程序。 –