如何使用urllib2来获取使用SSLv3加密的网页

时间:2011-11-07 17:02:50

标签: python ssl urllib2

我正在使用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 :(得分: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复制/粘贴,只需修改以指定ssl_version来电中的wrap_socket()

答案 1 :(得分:0)

只要您have the SSL libraries installed on your server(即您不必特别将其添加为处理程序),就应自动处理SSL。

http://docs.python.org/library/urllib2.html#urllib2.build_opener
  

如果Python安装具有SSL支持(即,如果可以导入ssl模块),则还将添加HTTPSHandler。

另外,请注意urlliburllib2已在python 3中合并,因此他们的方法略有不同

答案 2 :(得分:0)

由于我无法使用urllib2执行此操作,因此我最终放弃并转而使用像@Bruno这样的libCurl绑定,在评论中建议对pastylegs的答案。