python忽略证书验证urllib2

San*_* Hs 49 python urllib2 python-2.7 python-requests

我想certification validation在使用内部企业链接向服务器发出请求时忽略它.

使用python requests库我会这样做:

r = requests.get(link, allow_redirects=False,verify=False)
Run Code Online (Sandbox Code Playgroud)

如何使用urllib2库进行相同的操作?

Enn*_*per 128

在此期间,urllib2似乎默认验证服务器证书.过去显示警告消失了2.7.9,我目前在带有自签名证书(和Python 2.7.9)的测试环境中遇到了这个问题.

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

import urllib2
import ssl

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

urllib2.urlopen("https://your-test-server.local", context=ctx)
Run Code Online (Sandbox Code Playgroud)

根据文档调用SSLContext构造函数也应该直接工作.我没试过.

  • 如此邪恶,所以工作xD谢谢你.我已经陷入了绝望. (6认同)
  • 此解决方法不适用于python 2.6.6或2.7.6. (5认同)
  • 似乎`ssl.create_default_context`仅在Python 3.4+中可用. (4认同)

Kro*_*ron 41

最简单的方法:

python 2

import urllib2, ssl

request = urllib2.Request('https://somedomain.co/')
response = urllib2.urlopen(request, context=ssl._create_unverified_context())
Run Code Online (Sandbox Code Playgroud)

蟒蛇3

from urllib.request import urlopen
import ssl

response = urlopen('https://somedomain.co', context=ssl._create_unverified_context())
Run Code Online (Sandbox Code Playgroud)

  • 这个方法有效,但是将import语句更改为`from urllib.request import urlopen`而不是`import urllib2`.有关详细信息,请参阅/sf/ask/195485531/上接受的答案. (3认同)
  • 确保您具有更高的python版本。ubuntu 14.04随附的版本不支持此方法。 (2认同)

小智 33

对于那些使用开瓶器的人,你可以根据EnnoGröper的优秀答案达到同样的效果:

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

然后像以前一样使用它.

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


小智 5

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

import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
urllib2.urlopen("https://your-test-server.local", context=ctx)
Run Code Online (Sandbox Code Playgroud)

如果您需要开启器,只需添加以下上下文:

opener = urllib2.build_opener(urllib2.HTTPSHandler(context=ctx))
Run Code Online (Sandbox Code Playgroud)

注意:以上所有测试环境均为python 2.7.12。我在这里使用PROTOCOL_SSLv23,因为文档如此说,其他协议也可能适用,但取决于您的计算机和远程服务器,请查看文档以获取详细信息。


tha*_*van -2

urllib2 默认不验证服务器证书。检查此文档。

编辑:正如下面的评论所指出的,对于较新版本的 Python(似乎 >= 2.7.9),情况不再如此。参考下面的答案

  • 这似乎不再是真的了。 (50认同)
  • “不再真实了”——这完全没用。世界上并不是所有的 Python 版本都神奇地升级了——对于仍在使用 2.7.6 的人来说实际上仍然如此! (11认同)
  • 那么,如果他当时的答案是正确的,为什么他会被否决呢?上课 (9认同)