2017-10-06 183 views
1

此代碼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 –

回答

5

正如已經在評論中指出:該網站有這可從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

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

你應該寫這樣的,我已經驗證它

+0

如果你想從提問者處獲得更多信息,請使用評論。只是藍色鏡頭的答案可能會被降低。 –

+0

這只是禁用任何種類的證書驗證。這應該只用於測試,但從不在生產中,因爲它會在中間人攻擊中向人打開應用程序。 –

相關問題