如何只获得 TLS 握手,而不使用记录层?

  • 本文关键字:记录 握手 TLS java ssl tls1.3
  • 更新时间 :
  • 英文 :


我正在查看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进行没有I/O的TLS (应用程序或框架需要插入网络,例如使用NIO(,或者通过通常的InputStream/OutputStream阻塞I/O通过TCP进行SSLSocket(或SSLServerSocket(。

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似乎最接近,但它仍然只有两种wrapunwrap创建/读取密文和读取/生成纯文本的方法(尽管我可能只能在不传输任何实际数据的情况下进行握手(。

有没有一种简单的方法来剥离记录层?或者我可以使用不同的实现吗?

我还需要从中获取实际的密钥(或者更确切地说,主密钥(。

有一个简单的方法。你写了一个SSLEngine,它是真实一个的包装器。 您可以删除环绕中的框架和解包部分中的框架。您只需委派所有其他方法。

最新更新