SSLSessionCache apache не работает правильно с TLSv1.3 и изящный перезапуск? (Сеансовое возобновление) - PullRequest
3 голосов
/ 05 февраля 2020

У меня очень простая 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 включен, он не работает.


...