如何确保轮换TLS会话票证?

时间:2018-01-25 20:23:52

标签: python ssl tls1.2

我使用Python's SSL module(在引擎盖下运行LibreSSL 2.2.7)在客户端和服务器之间建立了一个简单的TLS 1.2会话,我想知道会话票是否会自动轮换。

看起来服务器暗示客户端会话票证的有效期仅为300秒(Session Ticket Lifetime Hint: 300 seconds

enter image description here

但是差不多一个小时了,还没有像我预期的那样发行新的会议门票。与此同时,我在双方之间交换了一些申请数据,但这似乎没有触发任何内容。

Per RFC 4507我理解不要严格遵守300秒提示

  

ticket_lifetime_hint字段包含来自服务器的提示   关于机票应存储多长时间。值表示   以秒为单位的生命周期,作为网络中的32位无符号整数   字节顺序。保留值为零以指示该值   机票的有效期未指定。客户端应该删除   时间到期时的票证和关联状态。它可以删除   早先根据当地政策提供的机票。服务器可以对待一个   机票有效期较短或较长时间   在ticket_lifetime_hint中说明。

但是我怎么知道机票轮换是否正在发生?如何在旋转票证之前检查客户等待的时间?

1 个答案:

答案 0 :(得分:1)

会话票证由握手期间服务器提供。要启动握手,您必须先从一个带有空票证的新连接开始(例如通过播放HTTP keep alives),或者在已建立的连接中强制重新握手。不幸的是,保持连接打开很长时间并且等待看到任何事情就像发生票证更新一样不太可能发生。

如果要使用新连接重新启动,请编写客户端以关闭并不时重新打开新连接,或者尝试在服务器端使用HTTP Keep-Alive标头,该标头应该通知客户端应该如何表现。 不幸的是,我们不确定此标头行为,因为我们知道此标头存在于RFC 2068中,但其使用在RFC draft中描述,现在已过期。 使用示例:

  

Keep-Alive:timeout = 300

如果您可以访问低级API,则可以进行SSL重新握手。然后服务器可以发送HelloRequest强制客户端开始重新握手,此时如果前一个被认为已过期,它应该要求新的票证。

在这两种情况下,您都应该通过网络捕获确认它的行为符合预期。如果您不使用低级语言进行编码,则可能无法看到任何内容(例如,Java允许编写rehandshakes代码,但我不确定整个服务器的编码是否值得。)