提问者:小点点

没有记录层,我怎么能得到TLS的握手?


我正在查看最近的QUIC传输协议(传输和TLS)的Internet草案,并想知道如何在Java(或另一种JVM语言)中实现它,假设我不想同时重新实现TLS1.3。

TLS通常基于TCP(或具有类似服务的其他协议),TLS本身有两层:

   +--------------+--------------+--------------+
   |  Handshake   |    Alerts    |  Application |
   |    Layer     |              |     Data     |
   |              |              |              |
   +--------------+--------------+--------------+
   |                                            |
   |               Record Layer                 |
   |                                            |
   +--------------------------------------------+
   |                                            |
   |                   TCP                      |
   |                                            |
   +--------------------------------------------+
   

图表改编自互联网草案,第2.1节

Java,我们可以使用javax.net. ssl中的类来实现这一点,或者使用SSLEngine进行TLS而无需I/O(应用程序或框架需要插入网络,例如使用NIO),或者使用SSLSocket(或SSLServerSocket)通过通常的InputStream/OutputStream阻塞I/O进行TCPTLS。

QUIC仅使用TLS1.3的握手部分来协商会话密钥,同时使用自己的数据包格式和加密(数据包保护)而不是TLS的记录层(整个过程基于UDP,而不是TCP):

   +--------------+--------------+ +-------------+
   |     TLS      |     TLS      | |    QUIC     |
   |  Handshake   |    Alerts    | | Applications|
   |              |              | | (h2q, etc.) |
   +--------------+--------------+-+-------------+
   |                                             |
   |                QUIC Transport               |
   |   (streams, reliability, congestion, etc.)  |
   |                                             |
   +---------------------------------------------+
   |                                             |
   |            QUIC Packet Protection           |
   |                                             |
   +---------------------------------------------+
   |                                             |
   |                   UDP                       |
   |                                             |
   +---------------------------------------------+

图表改编自互联网草案,第3节

所以现在我的问题是:给定的TLS实现(从Java11开始,我们TLS1.3)只有一个盒子里的TLS,即一起记录握手警报,而不是只记录握手版本。SSLEngine似乎是最近的,但它仍然只有两个包装展开方法,它们创建/读取密文并读取/生成纯文本(尽管我可能能够在不传输任何实际数据的情况下只进行握手)。

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

我还需要得到实际的密钥(或者更确切地说,主秘密)。


共1个答案

匿名用户

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