Apache 阿帕奇';s SSLSessionCache无法与TLSv1.3一起正常工作并正常重新启动?(续会)

Apache 阿帕奇';s SSLSessionCache无法与TLSv1.3一起正常工作并正常重新启动?(续会),apache,openssl,httpd.conf,mod-ssl,session-cache,Apache,Openssl,Httpd.conf,Mod Ssl,Session Cache,我有一个非常简单的httpd设置,设置了SSLSessionCache指令,这样在正常重启(在共享内存中)之后,会话也可以使用 然后,我使用openssl s_客户端和-sess_out参数连接到服务器,因此我有一个sessionfile 下一步是优雅地重新启动apache 然后,这次使用带有-sess_-in参数的sessionfile再次连接openssl s_客户端 这在TLSv1.2中非常有效 但在TLSv1.3 mod_中,ssl不知何故会倒退到完全握手。SSL_session_reu

我有一个非常简单的httpd设置,设置了SSLSessionCache指令,这样在正常重启(在共享内存中)之后,会话也可以使用

然后,我使用openssl s_客户端和-sess_out参数连接到服务器,因此我有一个sessionfile

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

然后,这次使用带有-sess_-in参数的sessionfile再次连接openssl s_客户端

这在TLSv1.2中非常有效

但在TLSv1.3 mod_中,ssl不知何故会倒退到完全握手。SSL_session_reused()返回false。如果我做了完全相同的测试,但没有在请求之间优雅地重新启动,它就会工作,SSL_session_reused()返回true

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

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

CLT0-0发送: 版本:TLS1.3(772) 长度:512 内容类型:握手(22) 消息类型:ClientHello(1) CLT0-0接收: 版本:TLS1.3(772) 长度:128 内容类型:握手(22) 消息类型:ServerHello(2) 服务器扩展(43):支持的版本 服务器扩展(51):密钥共享 服务器扩展(41):预共享密钥 CLT0-0接收: 版本:TLS1.3(772) 长度:6 内容类型:握手(22) 消息类型:EncryptedExtensions(8) CLT0-0接收: 版本:TLS1.3(772) 长度:52 内容类型:握手(22) 消息类型:已完成(20) CLT0-0发送: 版本:TLS1.3(772) 长度:1 内容类型:ChangeCipherSpec(20) CLT0-0发送: 版本:TLS1.3(772) 长度:52 内容类型:握手(22) 消息类型:已完成(20) 在这里,我们看到客户机在其ClientHello中发送“预共享密钥”扩展。然后,服务器使用其ServerHello进行响应,该服务器还包含预共享密钥扩展,并直接使用EncryptedExtensions和Finish消息继续。无证书和证书验证消息

优雅重启(错误行为)

CLT0-0发送: 版本:TLS1.3(772) 长度:512 内容类型:握手(22) 消息类型:ClientHello(1) CLT0-0接收: 版本:TLS1.3(772) 长度:122 内容类型:握手(22) 消息类型:ServerHello(2) 服务器扩展(43):支持的版本 服务器扩展(51):密钥共享 CLT0-0接收: 版本:TLS1.3(772) 长度:6 内容类型:握手(22) 消息类型:EncryptedExtensions(8) CLT0-0接收: 版本:TLS1.3(772) 长度:1738 内容类型:握手(22) 消息类型:证书(11) CLT0-0接收: 版本:TLS1.3(772) 长度:264 内容类型:握手(22) 消息类型:CertificateVerify(15) CLT0-0接收: 版本:TLS1.3(772) 长度:52 内容类型:握手(22) 消息类型:已完成(20) CLT0-0发送: 版本:TLS1.3(772) 长度:1 内容类型:ChangeCipherSpec(20) CLT0-0发送: 版本:TLS1.3(772) 长度:52 内容类型:握手(22) 消息类型:已完成(20) 客户端发送相同的消息。但服务器随后会使用其ServerHello进行响应,该ServerHello不包含“预共享密钥”扩展名。然后,在第一次握手时发出一条Certificate和CertificateVerify消息

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

mod_ssl注册所有用于添加、删除和获取会话()的回调。ssl选项也已正确设置,因此openssl不会使用其内部缓存。但是现在使用TLSv1.3,我从来没有陷入过“get session”回调,而是总是陷入“new session”回调,即使是在我离开优雅重启和SSL_session_reused返回true的场景中。我已经看过openssl代码,实际上,在TLSv1.3中,这个回调从未被调用。所以我想知道这是否是不正确行为的原因


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

非常感谢您的帮助


更新

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



“我认为这是一个非常常见的用例”这里的“缓存”主要指使会话在多个httpd进程之间可用,而不是允许在优雅的重启过程中恢复握手。当然,缓存是用于此目的的,但是:1。它始终与TLS1.2完美配合,那么为什么不与TLS1.3配合使用呢?在我看来,这应该是相同的,独立于协议。。2.代码防御性地跳过了缓存的终止和重新初始化,那么会话到哪里去了? CLT0-0 send: Version: TLS 1.3 (772) Length: 512 Content-Type: Handshake (22) Message-Type: ClientHello (1) CLT0-0 receive: Version: TLS 1.3 (772) Length: 128 Content-Type: Handshake (22) Message-Type: ServerHello (2) Server extension (43): supported versions Server extension (51): key share Server extension (41): pre shared key CLT0-0 receive: Version: TLS 1.3 (772) Length: 6 Content-Type: Handshake (22) Message-Type: EncryptedExtensions (8) CLT0-0 receive: Version: TLS 1.3 (772) Length: 52 Content-Type: Handshake (22) Message-Type: Finished (20) CLT0-0 send: Version: TLS 1.3 (772) Length: 1 Content-Type: ChangeCipherSpec (20) CLT0-0 send: Version: TLS 1.3 (772) Length: 52 Content-Type: Handshake (22) Message-Type: Finished (20) CLT0-0 send: Version: TLS 1.3 (772) Length: 512 Content-Type: Handshake (22) Message-Type: ClientHello (1) CLT0-0 receive: Version: TLS 1.3 (772) Length: 122 Content-Type: Handshake (22) Message-Type: ServerHello (2) Server extension (43): supported versions Server extension (51): key share CLT0-0 receive: Version: TLS 1.3 (772) Length: 6 Content-Type: Handshake (22) Message-Type: EncryptedExtensions (8) CLT0-0 receive: Version: TLS 1.3 (772) Length: 1738 Content-Type: Handshake (22) Message-Type: Certificate (11) CLT0-0 receive: Version: TLS 1.3 (772) Length: 264 Content-Type: Handshake (22) Message-Type: CertificateVerify (15) CLT0-0 receive: Version: TLS 1.3 (772) Length: 52 Content-Type: Handshake (22) Message-Type: Finished (20) CLT0-0 send: Version: TLS 1.3 (772) Length: 1 Content-Type: ChangeCipherSpec (20) CLT0-0 send: Version: TLS 1.3 (772) Length: 52 Content-Type: Handshake (22) Message-Type: Finished (20)