Python中的HTTPS会话重用
我想要能够同时向一个HTTPS服务器发送多个请求。目前,我在使用PyCURL,但它不能在不同的请求之间重复使用相同的SSL会话ID,而且每个请求只能处理一次下载或上传。
考虑到协商的过程需要时间(特别是因为使用了客户端证书),如果能像浏览器那样重复使用这个ID(浏览器可以同时下载几个资源),这可能会提高性能。
所以,有没有人知道PyCURL的解决方法,或者有没有其他支持这个功能的HTTP模块?httplib似乎也不行。
1 个回答
1
目前,重复使用会话ID并不是很容易实现,正如这里所提到的那样,我还没有听说有什么简单的解决办法。不过,这应该只是保存你在初始握手后得到的上下文,然后再使用它的问题。
PyOpenSSL提供了这些机制,但它的层次比大多数人想要的要低。我认为可以按照以下步骤进行:
- 首先,弄清楚如何处理会话重用的事情,先做一个概念验证。一个有用的工具是openssl这个命令行工具(人们通常用它来生成SSL密钥)。它有一个内置的客户端,你可以这样使用:
openssl s_client -connect HOST:443
你可以打印出各种有用的诊断信息(比如你的SSL会话ID),这样你就可以在解决当前问题的范围之外进行验证。
一旦你有了这些,httplib的SSL支持其实很简单,HTTPSConnection只是对HTTPConnection的一个很薄的封装(只扩展了两个方法)。你想要修改的是connect这个方法。
httplib.py - HTTPSConnection类
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)