urllib2報錯[SSL:CERTIFICATE_VERIFY_FAILED]

在python中使用urllib2庫去訪問一個自簽名的網(wǎng)站時,會出現(xiàn)如下報錯: urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>

出現(xiàn)以上錯誤的原因是因為python的版本問題,在python2.6(含2.6)以下版本中,在訪問HTTPS的網(wǎng)站時,TLS握手期間不會檢查服務(wù)器X509的證書簽名是否是CA的可信任根證書。這種局面在python2.7 3.4 和 3.5版本中得到了修改。

所以,以下代碼在python2.6版本中測試是完全沒有問題的


import json
import urllib
import urllib2

url='https://www.20150509.cn:1559'

def test():
  
  pre_data = [{"client":"local", "tgt":"*", "fun":"test.ping"}]

  json_data = json.dumps(pre_data)
  
  header = {"Content-Type":"application/json", "Accept":"application/json", "X-Auth-Token":"b91e7uj86g4f97cc**********b92778ujh4kedf"}

  request = urllib2.Request(url, json_data, header)

  response = urllib2.urlopen(request)

  html = response.read()

  print html


if __name__=="__main__":
  test()

運行測試

shell> python sa.py 
{"return": [{"vm3.salt.com": true, "vm2.salt.com": true, "ph1.salt.com": true, "ph2.salt.com": true, "vm1.salt.com": true, "vm4.salt.com": true, "localhost": true, "vm7.salt.com": true}]}


在python2.7+版本就會報上述錯誤

shell> python sa.py 
Traceback (most recent call last):
  File "sa.py", line 25, in <module>
    test()
  File "sa.py", line 17, in test
    response = urllib2.urlopen(request)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen
    return opener.open(url, data, timeout)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open
    response = self._open(req, data)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open
    '_open', req)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain
    result = func(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open
    context=self._context)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>

解決方法:

import json
import urllib
import urllib2
import ssl   #add line 1

ssl._create_default_https_context = ssl._create_unverified_context  #add line 2

url='https://www.20150509.cn:1559'

def test():
  
  pre_data = [{"client":"local", "tgt":"*", "fun":"test.ping"}]

  json_data = json.dumps(pre_data)
  
  header = {"Content-Type":"application/json", "Accept":"application/json", "X-Auth-Token":"b91e7uj86g4f97cc**********b92778ujh4kedf"}

  request = urllib2.Request(url, json_data, header)

  response = urllib2.urlopen(request)

  html = response.read()

  print html


if __name__=="__main__":
  test()


參考文檔:

http://https://www.python.org/dev/peps/pep-0476/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,822評論 6 427
  • 前言 Python的創(chuàng)始人為Guido van Rossum。1989年圣誕節(jié)期間,在阿姆斯特丹,Guido為了打...
    依依玖玥閱讀 3,697評論 6 37
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,716評論 25 709
  • 說什么我也不會將就的!一生一世一雙人,相思相望不相親。 都說在校園里的愛情走不到天荒地老,但我信,校園里的愛情還是...
    小花孟閱讀 211評論 0 1
  • 同學(xué)們,老師們。大家好。 大名人高爾基曾經(jīng)說過:書籍是人類進步的階梯,人類的進步,都是由看書才可以進步的,最近有一...
    百合花中哥哥閱讀 1,674評論 0 0

友情鏈接更多精彩內(nèi)容