У меня очень простая httpd-установка с установленной директивой SSLSessionCache, так что сеансы доступны и после постепенного перезапуска (в общей памяти).
Затем я подключаюсь к серверу с помощью openssl s_client и параметра -sess_out, поэтому у меня есть файл сеанса.
Следующий шаг - постепенный перезапуск apache.
Затем после этого снова соединитесь с openssl s_client, используя файл сеанса с параметром -sess_in.
Это прекрасно работает с TLSv1.2.
Но с TLSv1. 3 mod_ssl как-то возвращается к полному рукопожатию. SSL_session_reused () возвращает false. Если я делаю точно такой же тест, но не выполняю изящный перезапуск между запросами, он работает, и SSL_session_reused () возвращает true.
Мы можем увидеть это также, если проследим ssl-сообщения:
без постепенного перезапуска (правильное поведение)
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)
Здесь мы видим, что клиент отправляет расширение «pre shared key» в своем ClientHello. Затем сервер отвечает своим ServerHello, который также содержит расширение предварительного общего ключа и продолжает напрямую с EncryptedExtensions и сообщением Fini sh. Сообщение Certificate and CertificateVerify отсутствует ...
с постепенным перезапуском (неправильное поведение)
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)
Клиент отправляет то же самое. Но затем Сервер отвечает своим ServerHello, который НЕ содержит расширение «предварительный общий ключ». Затем появляется сообщение Certificate и CertificateVerify, как в первом первом рукопожатии ...
Также я вижу странное поведение, связанное с обратными вызовами OpenSSL, которые регистрирует mod_ssl:
mod_ssl регистрирует все обратные вызовы для добавления, удаления и получение сеанса (https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_sess_set_get_cb.html). Параметры ssl, так что openssl не использует свой внутренний кеш, также установлены правильно. Но теперь с TLSv1.3 я никогда не впадаю в обратный вызов «get session», но всегда в обратный вызов «new session», даже в том случае, когда я оставляю изящный перезапуск и SSL_session_reused возвращает true. Я взглянул на код openssl и, действительно, в TLSv1.3 этот обратный вызов никогда не вызывался. поэтому мне интересно, может ли это быть причиной неправильного поведения ...
Я думаю, что это очень распространенный вариант использования («Разрешить возобновить ssl-сеансы после корректного перезапуска») и должен работать с TLSv1. 3, как это происходит с 1.2.
Любая помощь очень ценится!
ОБНОВЛЕНИЕ
Похоже, это связано с директивой SSLSessionTickets. С "SSLSessionTickets off" возобновление работы. Если SessionTickets включен, он не работает.