HTTP持久连接和SSL会话

9

HTTP是一种应用协议,底层的TCP连接可以关闭并重新打开而不影响HTTP应用(除了性能)。
使用HTTP1.1我们使用持久连接,但服务器或客户端仍然可以随时关闭连接。
为了安全起见,HTTP通过SSL/TLS使用TCP。
我的理解是SSL类似于一个应用程序,至少这是TCP“看待”SSL的方式。
我的问题是,如果安全连接建立后底层的TCP套接字在某个时候关闭,这是否意味着SSL会话变得无效,各方需要重新开始SSL握手?还是说底层的TCP连接与TLS会话无关?

谢谢!

2个回答

7
这意味着SSL会话无效,各方应重新开始SSL握手过程。TLS包括恢复会话的机制(仍然会执行一些操作,但比完整握手少),但并非所有应用程序都支持它。
请参见http://ietf.org/rfc/rfc2246.txt,F.1.4以获取有关恢复的技术细节。

从技术角度来看,SSL/TLS 不关心连接的类型,可以在 UDP 上使用(在 UDP 的情况下,使用 TLS 的改进版本称为 DTLS),命名管道、信鸽邮件等等(我们曾经在基于消息的通信通道上实现过它)。但是,人们已经达成一致意见,为了防止某些攻击,底层通道的断开会自动使 SSL 连接无效。一般来说,如果您同时实现通信的客户端和服务器端,并且也控制 SSL 函数 (例如,在使用我们的组件时),没有什么需要强制您这样做的。 - Eugene Mayevski 'Callback
@Eugene:所以最好的做法是考虑TLS会话失效吗?这不是由任何RFC强制要求或由TLS RFC暗示的,对吧? - Cratylus
@user384706,就我个人而言,我不知道当底层传输连接关闭时,关闭TLS连接是否是强制性的,但是可能会发生一些基于此的攻击。我认为这是一个非常值得深入探讨的好话题。 - Eugene Mayevski 'Callback
@Eugene:我打开了https://dev59.com/TFPTa4cB1Zd3GeqPjHDX 。关于这个线程,我应该假设我能做的最好的事情就是在服务器上设置一个较高的KeepAlive超时时间吗? - Cratylus
@user384706 正确的SSL实现应该使用某种短期缓存证书的方式来避免这种情况。例如,如果证书已经成功验证,则将其存储在缓存中,持续1小时,并在此期间信任它。 - Eugene Mayevski 'Callback
显示剩余3条评论

4

http://publib.boulder.ibm.com/httpserv/ihsdiag/ihs_performance.html#SSL :

SSL会话是客户端和Web服务器之间进行安全通信的逻辑连接。在建立SSL会话期间,使用公钥加密来交换客户端和服务器之间的共享秘密主密钥,并确定通信的其他特性,如密码。随后,在会话期间进行的数据传输使用对称密钥加密和解密,使用在SSL握手期间创建的共享密钥。

共享密钥的生成非常消耗CPU。为了避免为每个TCP连接生成共享密钥,可以重用相同的SSL会话进行多个连接。客户端必须在随后的握手中请求重用相同的SSL会话,并且服务器必须缓存SSL会话标识符。当满足这些要求时,随后的TCP连接的握手所需的服务器CPU要少得多(在某些测试中可减少80%)。目前所有主要的web浏览器都能够重用相同的SSL会话。但是,某些自定义的web客户端可能没有必要的支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接