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