如何在python 3.x中禁用ssl检查?

时间:2015-11-18 01:15:26

标签: python python-3.x ssl

我正在使用urllib.request.urlretrieve将文件下载到本地。

urllib.request.urlretrieve(url_string,file_name)

它抛出错误:

  

ssl.CertificateError未被用户代码处理   消息:主机名'foo.net'与'a248.e.akamai.net',' .akamaihd.net',' .akamaihd-staging.net',' .akamaized.net',' .akamaized-staging.net'

如果您将网址复制到Chrome中,它会向您显示通知,您需要说“继续访问网址”。

2 个答案:

答案 0 :(得分:20)

urllib.request.urlopen使用custom ssl context

import ssl
import urllib.request

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

with urllib.request.urlopen(url_string, context=ctx) as u, \
        open(file_name, 'wb') as f:
    f.write(u.read())

或者,如果您使用requests library,则可能更简单:

import requests

with open(file_name, 'wb') as f:
    resp = requests.get(url_string, verify=False)
    f.write(resp.content)

答案 1 :(得分:0)

功能urllib.request.urlretrieve不接受任何SSL选项,但urllib.request.urlopen接受。

不过,相反,可以使用ssl.create_default_context()创建一个安全的SSL上下文并使它不安全,而可以使用ssl.SSLContext()创建一个不安全的上下文:

此:

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

等效于:

ctx = ssl.SSLContext()

(对于Python <3.5.3使用ssl.SSLContext(ssl.PROTOCOL_TLSv1)

哪条线很不错:

import ssl
import urllib.request

with urllib.request.urlopen("https://wrong.host.badssl.com/", context=ssl.SSLContext()) as url:
    print(url.read())