我想certification validation
在我向具有内部公司链接的服务器的请求期间忽略 。
使用 pythonrequests
库我会这样做:
r = requests.get(link, allow_redirects=False,verify=False)
我如何对 urllib2 库做同样的事情?
我想certification validation
在我向具有内部公司链接的服务器的请求期间忽略 。
使用 pythonrequests
库我会这样做:
r = requests.get(link, allow_redirects=False,verify=False)
我如何对 urllib2 库做同样的事情?
同时 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)
根据文档,直接调用 SSLContext 构造函数也应该可以工作。我没试过。
最简单的方法:
蟒蛇2
import urllib2, ssl
request = urllib2.Request('https://somedomain.co/')
response = urllib2.urlopen(request, context=ssl._create_unverified_context())
蟒蛇 3
from urllib.request import urlopen
import ssl
response = urlopen('https://somedomain.co', context=ssl._create_unverified_context())
对于那些使用开瓶器的人,您可以根据 Enno Grö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()
然后像以前一样使用它。
根据build_opener和HTTPSHandler,如果ssl
模块存在,则添加一个 HTTPSHandler ,这里我们只指定我们自己的而不是默认的。
根据@Enno Gröper 的帖子,我尝试了 SSLContext 构造函数,它在我的机器上运行良好。代码如下:
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))
注意:以上所有测试环境都是 python 2.7.12。我在这里使用PROTOCOL_SSLv23,因为文档是这样说的,其他协议也可能有效,但取决于您的机器和远程服务器,请查看文档以获取详细信息。
一个更明确的示例,基于 Damien 的代码(调用http://httpbin.org/上的测试资源)。对于python3。请注意,如果服务器重定向到另一个 URL,则uri
inadd_password
必须包含新的根 URL(也可以传递 URL 列表)。
import ssl
import urllib.parse
import urllib.request
def get_resource(uri, user, passwd=False):
"""
Get the content of the SSL page.
"""
uri = 'https://httpbin.org/basic-auth/user/passwd'
user = 'user'
passwd = 'passwd'
context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, uri, user, passwd)
auth_handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
opener = urllib.request.build_opener(auth_handler, urllib.request.HTTPSHandler(context=context))
urllib.request.install_opener(opener)
return urllib.request.urlopen(uri).read()