我正在使用 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 类的上下文参数的等价物。
我意识到这个响应已经晚了几年,但我也遇到了同样的问题,并且不想依赖于我运行它的机器上安装的 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
调用
我是一名优秀的程序员,十分优秀!