我有一个非常简单的 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,它就不起作用。