Как я могу получить только рукопожатие TLS, без слоя записи?

Я просматривал последние интернет-проекты транспортного протокола QUIC ( транспортный и TLS) и удивлялся, как это можно реализовать в Java (или другом языке JVM), предполагая, что я не хочу переопределять TLS 1.3 одновременно.

TLS обычно основан на TCP (или некотором другом протоколе с подобной службой) с двумя уровнями в самом TLS:

   +--------------+--------------+--------------+
   |  Handshake   |    Alerts    |  Application |
   |    Layer     |              |     Data     |
   |              |              |              |
   +--------------+--------------+--------------+
   |                                            |
   |               Record Layer                 |
   |                                            |
   +--------------------------------------------+
   |                                            |
   |                   TCP                      |
   |                                            |
   +--------------------------------------------+

Схема адаптирована из интернет-проекта, раздел 2.1

В Java мы можем использовать классы в javax.net.ssl ​​для реализации этого, либо используя SSLEngine для просто TLS без ввода-вывода (приложение или инфраструктура должны подключаться к сети, например, с помощью NIO), либо SSLSocket (или SSLServerSocket) для TLS через TCP через обычный ввод-вывод блокирования InputStream/OutputStream.

QUIC использует только часть рукопожатия TLS 1.3 для согласования ключей сеанса, используя собственный формат пакета и шифрование ("Защита пакетов") вместо уровня записи TLS (и все это основано на UDP, а не TCP):

   +--------------+--------------+ +-------------+
   |     TLS      |     TLS      | |    QUIC     |
   |  Handshake   |    Alerts    | | Applications|
   |              |              | | (h2q, etc.) |
   +--------------+--------------+-+-------------+
   |                                             |
   |                QUIC Transport               |
   |   (streams, reliability, congestion, etc.)  |
   |                                             |
   +---------------------------------------------+
   |                                             |
   |            QUIC Packet Protection           |
   |                                             |
   +---------------------------------------------+
   |                                             |
   |                   UDP                       |
   |                                             |
   +---------------------------------------------+

Схема адаптирована из интернет-проекта, раздел 3

Итак, теперь моя проблема: данные реализации TLS (из Java 11 мы включили TLS 1.3) имеют только TLS в блоке, то есть запись + рукопожатие + оповещения вместе, а не версия только для рукопожатия. SSLEngine, кажется, приближается, но у него все еще есть два wrap а также unwrap методы, которые создают / читают зашифрованный текст и читают / производят простой текст (хотя я мог бы сделать только рукопожатие без передачи каких-либо фактических данных).

Есть ли простой способ снять слой записи? Или есть другая реализация, которую я мог бы использовать?

Я также должен был бы получить фактические ключи (или скорее главный секрет) из этого.

0 ответов

Есть простой способ. Вы пишете SSLEngine, который является оберткой настоящего. Затем вы можете снять раму в обертке и раму в размотанной части. Все остальные методы вы просто делегируете.

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