JEP 219:数据报传输层安全协议(DTLS)
概述
非目标
-
不以支持特定传输接口为目标(例如,
DatagramSocket
的 DTLS)。 -
不以支持 PMTU 发现为目标。
成功指标
该实现必须在客户端模式和服务器端模式中,至少成功地与另外两个 DTLS 实现进行互操作。
动机
支持 DTLS 对于满足越来越多的数据报兼容应用程序的安全传输需求非常重要。RFC 4347 列举了 TLS 不能适用于这些类型的应用程序的若干原因:
-
“TLS 是用于保护网络流量的最广泛部署的协议。……然而,TLS 必须运行在可靠的传输通道上——通常是 TCP。因此,它无法用于保护不可靠的数据报流量。”
-
“……越来越多的应用层协议被设计为使用 UDP 传输。特别是像会话发起协议(SIP)和电子游戏协议这样的协议越来越流行。”
-
“在许多情况下,保护客户端/服务器应用程序的最理想方式是使用 TLS;然而,对数据报语义的需求自动禁止了 TLS 的使用。因此,一个与数据报兼容的 TLS 变体非常受欢迎。”
支持 DTLS 的协议包括但不限于:
Google Chrome 和 Firefox 现在支持用于 Web 实时通信(WebRTC)的 DTLS-SRTP。主要的 TLS 厂商和实现,包括 OpenSSL、GnuTLS 和 Microsoft SChannel,都支持 DTLS 1.0 和 1.2 版本。
描述
我们预计 DTLS API 和实现会相当简洁。新的 API 应该与传输方式无关,并且类似于 javax.net.ssl.SSLEngine
。随着工作的进展,更多关于 API 的细节将会在此处添加。一些初步的设计考虑如下:
-
DTLS API 和实现将不管理读取超时。确定适当的超时值以及何时和如何触发超时事件将是应用程序的责任。
-
很可能会新增一个 API 以设置最大应用数据报大小(PMTU 减去 DTLS 每条记录的开销)。然而,如果没有明确指定大小,则 DTLS 实现应自动调整大小。如果某个片段丢失两到三次,实现可能会减小最大应用数据报大小,直到其足够小为止。
-
DTLS 实现应针对每次解包或打包操作最多消耗或生成一条 TLS 记录,以便该记录可以在数据报层单独传递,或者在传递顺序错乱时更容易重新组装。
-
如果有必要,重新组装乱序的应用数据是应用程序的责任。DTLS API 应提供对每条 DTLS 消息中的应用数据的访问。