我正在使用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类的上下文参数的等价物。
答案 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。
另外,请注意urllib
和urllib2
已在python 3中合并,因此他们的方法略有不同
答案 2 :(得分:0)
由于我无法使用urllib2执行此操作,因此我最终放弃并转而使用像@Bruno这样的libCurl绑定,在评论中建议对pastylegs的答案。