4

我有一个非常简单的 httpd-setup 和 SSLSessionCache 指令集,以便在正常重启后(在共享内存中)会话也可用。

然后我使用 openssl s_client 和 -sess_out 参数连接到服务器,所以我有一个会话文件。

下一步是优雅地重新启动 apache。

然后,这次使用带有 -sess_in 参数的 sessionfile 再次与 openssl s_client 连接。

这与 TLSv1.2 完美配合。

但是使用 TLSv1.3 mod_ssl 会以某种方式退回到完全握手。SSL_session_reused() 返回 false。如果我做了完全相同的测试,但没有在请求之间优雅地重新启动,它会起作用并且 SSL_session_reused() 返回 true。

如果我们跟踪 ssl 消息,我们也可以看到这一点:

没有优雅的重启(正确的行为)

CLT0-0 发送:
    版本:TLS 1.3 (772)
    长度:512
    内容类型:握手 (22)
    消息类型:ClientHello (1)
CLT0-0 接收:
    版本:TLS 1.3 (772)
    长度:128
    内容类型:握手 (22)
    消息类型:ServerHello (2)
    服务器扩展(43):支持的版本
    服务器扩展(51):密钥共享
    服务器扩展(41):预共享密钥
CLT0-0 接收:
    版本:TLS 1.3 (772)
    长度:6
    内容类型:握手 (22)
    消息类型:EncryptedExtensions (8)
CLT0-0 接收:
    版本:TLS 1.3 (772)
    长度:52
    内容类型:握手 (22)
    消息类型:已完成 (20)
CLT0-0 发送:
    版本:TLS 1.3 (772)
    长度:1
    内容类型:ChangeCipherSpec (20)
CLT0-0 发送:
    版本:TLS 1.3 (772)
    长度:52
    内容类型:握手 (22)
    消息类型:已完成 (20)

在这里,我们看到客户端在他的 ClientHello 中发送了“预共享密钥”扩展。然后,服务器用他的 ServerHello 进行响应,其中还包含预共享密钥扩展,并直接使用 EncryptedExtensions 和 Finish 消息继续。没有证书和 CertificateVerify 消息...

优雅重启(错误行为)

CLT0-0 发送:
    版本:TLS 1.3 (772)
    长度:512
    内容类型:握手 (22)
    消息类型:ClientHello (1)
CLT0-0 接收:
    版本:TLS 1.3 (772)
    长度:122
    内容类型:握手 (22)
    消息类型:ServerHello (2)
    服务器扩展(43):支持的版本
    服务器扩展(51):密钥共享
CLT0-0 接收:
    版本:TLS 1.3 (772)
    长度:6
    内容类型:握手 (22)
    消息类型:EncryptedExtensions (8)
CLT0-0 接收:
    版本:TLS 1.3 (772)
    长度:1738
    内容类型:握手 (22)
    消息类型:证书 (11)
CLT0-0 接收:
    版本:TLS 1.3 (772)
    长度:264
    内容类型:握手 (22)
    消息类型:CertificateVerify (15)
CLT0-0 接收:
    版本:TLS 1.3 (772)
    长度:52
    内容类型:握手 (22)
    消息类型:已完成 (20)
CLT0-0 发送:
    版本:TLS 1.3 (772)
    长度:1
    内容类型:ChangeCipherSpec (20)
CLT0-0 发送:
    版本:TLS 1.3 (772)
    长度:52
    内容类型:握手 (22)
    消息类型:已完成 (20)

客户端发送相同的。但是服务器随后用包含“预共享密钥”扩展名的 ServerHello 进行响应。然后是第一次握手中的 Certificate 和 CertificateVerify 消息...

我还看到与 mod_ssl 注册的 OpenSSL 回调相关的奇怪行为:

mod_ssl 注册用于添加、删除和获取会话的所有回调(https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_sess_set_get_cb.html)。也正确设置了 ssl 选项,以便 openssl 不使用其内部缓存。但是现在使用 TLSv1.3,我永远不会陷入“获取会话”回调,而是总是进入“新会话”回调,即使在我离开优雅重启并且 SSL_session_reused 返回 true 的场景中也是如此。我查看了 openssl 代码,实际上,在 TLSv1.3 中,这个回调永远不会被调用。所以我想知道这是否可能是不正确行为的原因......

我认为这是一个非常常见的用例(“允许在正常重启后恢复 ssl 会话”)并且应该像 1.2 一样与 TLSv1.3 一起使用。

任何帮助深表感谢!


更新

这似乎与 SSLSessionTickets 指令有关。随着“SSLSessionTickets off”的恢复工作。如果启用了 SessionTickets,它就不起作用。


4

0 回答 0