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))