python用requests請求,報SSL:CERTIFICATE_VERIFY_FAILED錯誤
requests模組之前一直正常的,某一天開始對https的請求都拋錯誤了:
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
起初,以為是代理不穩定,重啟代理無效,然後重啟機器,無效。程式碼問題?把錯誤程式碼copy到另一臺機器上沒問題,把在另外一臺機器上正常執行的程式碼再copy到報錯機器還是報證書錯誤。難道是requests庫的問題,試了requests.get請求http沒問題。
嘗試了各種解決辦法,都無果。還是到網上搜下答案吧。找到了兩種解決方案:我用的第一種。第二種也備份下。
第一種解決方案:
何謂ssl驗證?
SSL 證書就是遵守 SSL協議,由受信任的數字證書頒發機構CA,在驗證伺服器身份後頒發,具有伺服器身份驗證和資料傳輸加密功能。
SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
在python 2.7中新增一個新的特性,在urlopen請求的時候會驗證ssl證書,如果是自簽名的ssl證書會出錯。
python request ssl error 怎麼解決
在request.post 和request.get方法中都有一個verify的引數。把verify引數置為FALSE。
r = requests.get("xxx.com", headers=request_headers, verify=False)
print r.content
第二種解決方案:
試過:
sudo apt-get install ca-certificates
sudo update-ca-certificates
沒效果,
最後試了下面的起效的:
sudo pip uninstall -y certifi
sudo pip install certifi==2015.04.28
當然,還是有警告:
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:79: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. InsecurePlatformWarning
不夠,至少可以先用著了。原因估計就是高版本(2016.2.8)的certifi對證書驗證更為嚴格了。