1. 程式人生 > >python用requests請求,報SSL:CERTIFICATE_VERIFY_FAILED錯誤

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對證書驗證更為嚴格了。