11

我正在查看最近的 QUIC 传输协议(传输TLS)的 Internet 草案,并想知道如何在 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),或者SSLSocket(或 SSLServerSocket)通过通常的 InputStream/OutputStream 阻塞 I/O 用于 TCP 上的 TLS。

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方法来创建/读取密文和读取/生成纯文本(尽管我可能只进行握手而不传输任何实际数据)。

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

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

4

1 回答 1

0

有一个简单的方法。您编写一个 SSLEngine,它是真实的包装器。比您可以删除包装中的框架和展开部分中的框架。您只需委托的所有其他方法。

于 2018-12-13T20:24:00.607 回答