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

如何在Python3.x中禁用ssl检查?,python,python-3.x,ssl,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'均不匹配 如果你

我正在使用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'均不匹配

如果你将url复制到Chrome中,它会显示一个通知,你需要说“继续访问url”

用于:

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

import requests

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

函数
urllib.request.urlretrieve
不接受任何SSL选项,但
urllib.request.urlopen
接受

但是,您可以使用
SSL.SSLContext()
创建一个安全的SSL上下文,并使其不安全。您可以使用
SSL.SSLContext()
创建一个不安全的上下文:

这:

相当于:

ctx = ssl.SSLContext()
(对于Python<3.5.3,使用
ssl.SSLContext(ssl.PROTOCOL\u TLSv1)

这是一个很好的一行:

import ssl
import urllib.request

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

@JoranBeasley,不接受
验证
关键字参数。也许你会被搞糊涂。我猜第一个解决方案有一些输入错误,这很好:D将urllib.request.urlopen(url\u string,context=ctx)作为u:f=open(file\u name,'wb')f.write(u.read())使用,不确定Python3中是否有请求库tho@BingGan,我修正了打字错误。谢谢你的反馈<代码>请求支持Python 3.x<代码>pip安装请求和好处:当启用检查主机名时,我无法将验证模式设置为证书无。即使在设置
检查主机名=False后也是如此。有什么想法吗?好的,所以我们必须先设置
检查\u主机名
,然后再
验证\u模式
ctx
(第一个版本)给出不受支持的协议。@JamesHirschorn这是什么意思?你是怎么得到这个错误的?我是用你的代码得到这个错误的,有ctx的第一个定义,还有一个不同的url。因此:使用urllib.request.urlopen(my_url,context=ctx)作为url:print(url.read()),我想即使证书验证已关闭,该网站也可能不支持最近的协议?是的,这个技巧是禁用证书的特定检查。协议和密码仍然必须匹配。
ctx = ssl.SSLContext()
import ssl
import urllib.request

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