没有记录层,如何才能仅获得TLS握手?

时间:2018-10-13 23:47:54

标签: java ssl tls1.3

我正在查看QUIC传输协议(transportTLS)的最新Internet草案,并想知道如何在Java(或另一种JVM语言)中实现该协议。不想同时重新实现TLS 1.3。

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

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

根据internet draft, section 2.1

改编的图表

在Java中,我们可以使用javax.net.ssl中的类来实现此目的,或者使用SSLEngine仅针对TLS而无需I / O(应用程序或框架需要插入网络,例如使用NIO),或通过常规InputStream / OutputStream阻止I / O的TCP上的TLS的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                       |
   |                                             |
   +---------------------------------------------+

根据internet draft, section 3

改编的图表

所以现在我的问题是:给定的TLS实现(从Java 11开始,我们包括TLS 1.3)在一个框中只有 TLS ,即一起记录+握手+警报,而不是握手仅版本。 SSLEngine似乎最接近,但是它仍然只有两个wrapunwrap方法,用于创建/读取密文和读取/生成纯文本(尽管我可以仅进行握手而无需传输任何实际内容)数据)。

是否有一种简便的方法来剥离记录层?还是我可以使用其他实现方式?

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

1 个答案:

答案 0 :(得分:0)

有一个简单的方法。您编写了一个SSLEngine,它是实际的包装器。 比起将包装中的框架和展开部分中的框架都可以。您只需委派的所有其他方法。