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

Bin*_*Gan 12 python ssl python-3.x

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

urllib.request.urlretrieve(url_string,file_name)
Run Code Online (Sandbox Code Playgroud)

它抛出错误:

ssl.CertificateError了未处理由用户代码消息:主机名"foo.net"不匹配的任一"a248.e.akamai.net"," .akamaihd.net"," .akamaihd-staging.net",' . akamaized.net','. akamaized-staging.net'

如果您将网址复制到Chrome中,它会向您显示通知,您需要说"继续关注网址".

fal*_*tru 23

使用urllib.request.urlopen自定义的SSL方面:

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())
Run Code Online (Sandbox Code Playgroud)

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

import requests

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


mx0*_*mx0 6

函数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
Run Code Online (Sandbox Code Playgroud)

相当于:

ctx = ssl.SSLContext()
Run Code Online (Sandbox Code Playgroud)

(对于 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())
Run Code Online (Sandbox Code Playgroud)