SSLSessionCache apache не работает правильно с TLSv1.3 и изящным перезапуском? (возобновление сеанса)
У меня очень простая настройка 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 отправить: Версия: 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)
Здесь мы видим, что клиент отправляет расширение "pre shared key" в своем 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, как в первом рукопожатии...
Также я вижу странное поведение, связанное с обратными вызовами 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 я никогда не попадаю в обратный вызов "получить сеанс", но всегда в обратный вызов "новый сеанс", даже в сценарии, когда я оставляю плавный перезапуск, а SSL_session_reused возвращает true. Я взглянул на код openssl, и действительно, в TLSv1.3 этот обратный вызов никогда не вызывается. поэтому мне интересно, может ли это быть причиной неправильного поведения...
Я думаю, что это очень распространенный вариант использования ("Разрешить возобновление ssl-сессий после плавного перезапуска") и должен работать с TLSv1.3, как и с 1.2.
Любая помощь высоко ценится!
ОБНОВИТЬ
Похоже, это связано с директивой SSLSessionTickets. С "SSLSessionTickets off" возобновление работы. Если SessionTickets включены, это не работает.