Как я могу получить только рукопожатие 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, который является оберткой настоящего. Затем вы можете снять раму в обертке и раму в размотанной части. Все остальные методы вы просто делегируете.