Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python忽略证书验证urllib2_Python_Python 2.7_Urllib2_Python Requests - Fatal编程技术网

python忽略证书验证urllib2

python忽略证书验证urllib2,python,python-2.7,urllib2,python-requests,Python,Python 2.7,Urllib2,Python Requests,我想在通过内部公司链接向服务器请求时忽略认证验证 使用python请求库,我可以这样做: r = requests.get(link, allow_redirects=False,verify=False) 如何对urllib2库执行相同操作?默认情况下,urllib2不验证服务器证书。检查这个 编辑:正如下面的评论所指出的,对于Python的较新版本(看起来>=2.7.9),这不再是事实。同时,urllib2在默认情况下似乎会验证服务器证书。 我和for 2.7.9目前在使用自签名证书(和P

我想在通过内部公司链接向服务器请求时忽略
认证验证

使用python
请求
库,我可以这样做:

r = requests.get(link, allow_redirects=False,verify=False)

如何对urllib2库执行相同操作?

默认情况下,urllib2不验证服务器证书。检查这个


编辑:正如下面的评论所指出的,对于Python的较新版本(看起来>=2.7.9),这不再是事实。同时,urllib2在默认情况下似乎会验证服务器证书。 我和for 2.7.9目前在使用自签名证书(和Python 2.7.9)的测试环境中遇到了这个问题

我的邪恶解决方法(不要在生产中这样做!):


直接调用SSLContext构造函数也应该可以。我还没有试过。对于那些使用开瓶器的人,你可以根据恩诺·格洛珀的伟大答案实现同样的效果:

import urllib2, ssl

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

opener = urllib2.build_opener(urllib2.HTTPSHandler(context=ctx), your_first_handler, your_second_handler[...])
opener.addheaders = [('Referer', 'http://example.org/blah.html')]

content = opener.open("https://localhost/").read()
然后像以前一样使用它


根据和,如果存在
ssl
模块,则会添加一个HTTPSHandler,这里我们只指定我们自己的模块,而不是默认模块。

一个更明确的示例,构建在Damien的代码上(在上调用测试资源)。对于蟒蛇3。请注意,如果服务器重定向到另一个URL,
add\u password
中的
uri
必须包含新的根URL(也可以传递URL列表)

最简单的方法:

python 2

import urllib2, ssl

request = urllib2.Request('https://somedomain.co/')
response = urllib2.urlopen(request, context=ssl._create_unverified_context())
python 3

from urllib.request import urlopen
import ssl

response = urlopen('https://somedomain.co', context=ssl._create_unverified_context())

根据@Enno Gröper的帖子,我尝试了SSLContext构造函数,它在我的机器上运行良好。代码如下:

import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
urllib2.urlopen("https://your-test-server.local", context=ctx)
如果您需要opener,只需添加如下上下文:

opener = urllib2.build_opener(urllib2.HTTPSHandler(context=ctx))

注意:以上所有测试环境都是python2.7.12。我在这里使用协议_SSLv23,因为上面说了,其他协议也可以工作,但取决于您的机器和远程服务器,请查看文档了解详细信息

这似乎不再是真的了。事实上,这已经不是真的了。那么,如果他当时的回答是正确的,为什么他会被否决呢?上一些“不再是真的”的课——那是完全没有用的。世界上并不是所有人都神奇地升级了Python版本——事实上,对于仍然使用2.7.6的人来说,这仍然是真的!非常邪恶,非常有效,谢谢你。我已经陷入绝望。似乎
ssl.create\u default\u context
仅在Python 3.4+中可用。这对我使用Python 2.7.9(已安装OSX自制)非常有效,谢谢!这种变通方法既不能用于python 2.6.6,也不能用于python 2.7.6。这种变通方法很完美,但不要在2.7.9之前使用上下文参数调用urllib2.urlopen(),仅此而已。我在2.7.10和2.6.x中都使用了这个。使用以下代码检查版本:sys.version\u info>=(2,7,9)。很好的调用,这看起来类似于此站点中描述的方法。我不同意,嗯,这不一样。您提到的文章使用了一个类扩展,而这个方法使用普通的实现,并且只使用ssl上下文。也就是说,你提到的这篇文章对于任何想要修改和扩展默认HTTPSHandler行为的人来说都是一个很好的观点。我明白你的意思,我没有抓住这个细微差别,你的文章绝对更干净,不需要扩展任何内容。确保你有一个更高的python版本。ubuntu 14.04附带的版本不支持此方法。此方法有效,但将导入语句从urllib更改为
。请求导入urlopen
,而不是
导入urllib2
。有关更多信息,请参阅上的已接受答案。感谢您使用标准库回答python3 way。准备上下文对我很有用。
import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
urllib2.urlopen("https://your-test-server.local", context=ctx)
opener = urllib2.build_opener(urllib2.HTTPSHandler(context=ctx))