我正在查看QUIC传输协议(transport和TLS)的最新Internet草案,并想知道如何在Java(或另一种JVM语言)中实现该协议。不想同时重新实现TLS 1.3。
TLS 通常基于TCP(或其他具有类似服务的协议),并且TLS本身具有两层:
+--------------+--------------+--------------+
| Handshake | Alerts | Application |
| Layer | | Data |
| | | |
+--------------+--------------+--------------+
| |
| Record Layer |
| |
+--------------------------------------------+
| |
| TCP |
| |
+--------------------------------------------+
改编的图表
在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 |
| |
+---------------------------------------------+
改编的图表
所以现在我的问题是:给定的TLS实现(从Java 11开始,我们包括TLS 1.3)在一个框中只有 TLS ,即一起记录+握手+警报,而不是握手仅版本。 SSLEngine似乎最接近,但是它仍然只有两个wrap
和unwrap
方法,用于创建/读取密文和读取/生成纯文本(尽管我可以仅进行握手而无需传输任何实际内容)数据)。
是否有一种简便的方法来剥离记录层?还是我可以使用其他实现方式?
我还需要从中获取实际的密钥(或更确切地说,是主密钥)。
答案 0 :(得分:0)
有一个简单的方法。您编写了一个SSLEngine,它是实际的包装器。 比起将包装中的框架和展开部分中的框架都可以。您只需委派的所有其他方法。