如何使用urllib2通过SSLv3加密获取网页
我正在使用Python 2.7,想要获取一个需要使用sslv3的网页内容。目前,当我尝试访问这个页面时,出现了错误SSL23_GET_SERVER_HELLO。经过一些网上搜索,我找到了一个解决方案,这个方案在Python 3中可以解决这个问题。
urllib.request.install_opener(urllib.request.build_opener(urllib.request.HTTPSHandler(context=ssl.SSLContext(ssl.PROTOCOL_TLSv1))))
我该如何在Python 2.7中实现同样的效果呢?因为我找不到HTTPSHandler类中相应的上下文参数。
3 个回答
0
只要你的服务器上安装了SSL库,SSL就会自动处理(也就是说,你不需要特别添加它作为处理程序)。
http://docs.python.org/library/urllib2.html#urllib2.build_opener
如果你的Python安装支持SSL(也就是说,可以导入ssl模块),那么HTTPSHandler也会被添加上。
另外,注意在Python 3中,urllib
和urllib2
已经合并了,所以它们的使用方式有点不同。
2
我知道这个回答来得有点晚,但我也遇到了同样的问题,而且不想依赖于机器上安装了libcurl。希望这对将来看到这个帖子的人有帮助。
问题在于,httplib.HTTPSConnection.connect
这个函数没有办法指定SSL的上下文或版本。你可以在脚本的主要部分之前重写这个函数,来快速解决问题。
一个重要的考虑是,上面提到的这个解决方法不会验证服务器证书的有效性。
import httplib
import socket
import ssl
import urllib2
def connect(self):
"Connect to a host on a given (SSL) port."
sock = socket.create_connection((self.host, self.port),
self.timeout, self.source_address)
if self._tunnel_host:
self.sock = sock
self._tunnel()
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_TLSv1)
httplib.HTTPSConnection.connect = connect
opener = urllib2.build_opener()
f = opener.open('https://www.google.com/')
*注意:这个替代的connect()
函数是从httplib.py中复制粘贴过来的,只是简单修改了一下,以便在wrap_socket()
调用中指定ssl_version
0
因为我用不了urllib2,所以最后我听从了@Bruno在pastylegs回答的评论中提到的建议,转而使用了libCurl这个库。