我正在尝试使用Python从内部服务器下载一些数据。由于它是内部的,因此它使用自签名证书。 (我们不想向Verisign支付那些永远不会出现的服务器。)Python 2.6版本的代码工作正常。
response = urllib2.urlopen(URL)
data = csv.reader(response)
我现在正在尝试更新到Python 3.4(长话,不要问。)但是,使用Python 3的urllib失败了:
response = urllib.request.urlopen(URL)
它会抛出CERTIFICATE_VERIFY_FAILED错误。
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)>
在网上阅读时,显然Python 2.6 urllib2并不打算验证证书。某些版本的urllib允许将“verify = False”传递给方法签名,但这似乎不适用于Python 3.4。
有谁知道我怎么能解决这个问题?由于公司安全准则,我想避免使用Requests包。
答案 0 :(得分:3)
urllib.request.urlopen
有一个context关键字参数,可以接受SSLContext个对象。因此,将SSLContext
对象设置为.verify_mode SSLContext.verify_mode = ssl.CERT_NONE
,即verify=False
,应该等于performFetchWithCompletionHandler
答案 1 :(得分:0)
使用urllib3:
import urllib3
urllib3.disable_warnings()
http.request('GET', 'https://example.org')