升级到 TLSv1.3 时 SSLEngine 使用的变化

ala*_*mar 5 java nio sslengine java-11 tls1.3

Java 11 随TLSv1.3支持发布,默认使用。

它在 HTTPS 和 SSL 套接字的上下文中工作正常,但似乎在使用时SSLEngine由于TLSv1.3行为的变化而存在额外的障碍。

因此,通过NIOusing有一个强大的通信实现,SSLEngineTLSv1.3启用时不再起作用。没有明显的错误,以异常或 SSL 错误的形式,两个节点只会来回发送 wrap/unwrap 消息并最终超时。

我对使用 TLSv1.2 的 SSLEngine 和使用 TLSv1.3 的 SSLEngine 之间的行为变化的确切列表感兴趣,如果可能的话,还有它们之间的迁移清单。不幸的是,Java 11 的 SSLEngine javadocs 没有这些信息——Java 11 中没有新方法,也没有对 TLSv1.3 的引用。

sko*_*isa 6

确实,SSLEngine在 JDK 11 中的 Javadoc 中没有明确提及 TLS 1.3 对 TLS 1.3 的影响,并且其方法也没有变化。

然而,阶段列表中的第五项(闭包)SSLEngine在 JDK 11 的 Javadoc 开头的一般描述中进行了更新:

关闭 - 当不再需要连接时,客户端和服务器应用程序应该各自关闭各自连接的两端。对于SSLEngine对象,应用程序应该调用 closeOutbound()并向对等方发送任何剩余的消息。同样,应用程序应在调用 之前接收来自对等方的任何剩余消息closeInbound()。然后可以在关闭两侧后关闭底层传输机制SSLEngine。如果连接没有以有序的方式关闭(例如 closeInbound()在收到对等方的写关闭通知之前调用),将引发异常以指示发生了错误。引擎一旦关闭,就不可重用:SSLEngine必须创建一个新引擎。

Oracle 的 JDK 11 发行说明中也讨论了该更改:

TLS 1.3 半关闭策略 添加
了新的系统属性 jdk.tls.acknowledgeCloseNotify。系统属性的默认值为 false。如果系统属性设置为true,close_notify alert则在收到close_notify警报时会发送 相应的消息,并双工关闭连接。

TLS 1.2 和之前的版本使用双工关闭策略,而 TLS 1.3 使用半关闭策略。TLS 1.3 的入站和出站 close_notify 警报是独立的。升级到 TLS 1.3 时,如果您的应用程序仅使用SSLEngine.closeInbound()SSLEngine.closeOutbound()API 中的一个来关闭 (D)TLS 连接,而不是在连接的每一侧同时使用这两个 API,则可能会发生意外行为。如果您的应用程序在底层 (D)TLS 传输未双工关闭时出现意外挂起或超时,您可能需要将此属性设置为 true。

请注意,当不再需要 TLS/DTLS 连接时,客户端和服务器应用程序应分别关闭各自连接的两端。

因此jdk.tls.acknowledgeCloseNotify,在使用TLS 1.3时,设置为true可能会解决您对超时的特定担忧SSlEngine

如果您的应用程序在底层 (D)TLS 传输未双工关闭时出现意外挂起或超时,您可能需要将此属性设置为 true。

发行说明文档还链接到已关闭的 JDK 错误JDK-8208526:TLS 1.3 半关闭和同步问题,其中更详细地讨论了更改。

相关的(和关闭的)错误JDK-8207009:TLS 1.3 半关闭和同步问题也可能引起关注。

其他参考资料:

  • 请参阅RFC 8446 的附录 D.向后兼容性” :“传输层安全 (TLS) 协议版本 1.3 ”(第 138-141 页)。
  • 在 2:53:37 和 2:56:35 之间的这段 Oracle 视频“星期一技术会议:Moscone West 2004 ”中简要讨论了 TLS 1.3 和早期版本之间的兼容性。


ala*_*mar 0

最后,我们需要在握手完成后从缓冲区读取剩余数据,解开它并更新握手状态。看起来像是我们之前没有处理过的边缘情况。

相关提交:IGNITE-11298 修复以支持通信中的 TLSv1.3