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 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證書,它將無助於將其添加到信任存儲區。
這解決了我的問題,非常感謝你的解釋。 – Oliver
import requests
html = requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx",verify=False).text
你應該寫這樣的,我已經驗證它
如果你想從提問者處獲得更多信息,請使用評論。只是藍色鏡頭的答案可能會被降低。 –
這只是禁用任何種類的證書驗證。這應該只用於測試,但從不在生產中,因爲它會在中間人攻擊中向人打開應用程序。 –
您正在使用哪種版本的Python和操作系統? – Alasdair
對不起,Python 3.6.3和Windows 7 – Oliver
該網站有一個不好的SSL實施:https://www.ssllabs.com/ssltest/analyze.html?d=hcaidcs.phe.org.uk –