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 включены, это не работает.


0 ответов

Другие вопросы по тегам