Как я могу получить только рукопожатие TLS, без слоя записи? - PullRequest
0 голосов
/ 14 октября 2018

Я просматривал последние интернет-проекты транспортного протокола QUIC ( transport и 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 метода, которые создают / читают зашифрованный текст и читают / производят простой текст (хотя я мог бы сделать только рукопожатие без передачи каких-либо фактических данных).

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

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

1 Ответ

0 голосов
/ 13 декабря 2018

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

...