最近 Java 升级导致椭圆曲线服务器证书的 TLS 握手失败?

Recent Java upgrade causes TLS handshake failure with elliptic curve server certificate?

10 月 19 日,我升级到 OpenJDK Java 1.8.0_232,我的 Java 进程开始无法连接到使用 EC 服务器证书的 stunnel 前端服务。我有一个 EC 客户端证书,如果初始握手成功,我会向服务器出示该证书,但它还没有那么远。

我无法获得 Java 的 先前 版本的版本号,即 运行 -- 我有一个长-运行 能够成功连接到服务的客户端上的进程。 Java 已升级,但该客户端自升级后尚未重新启动。我重新启动客户端,它也开始失败。

我正准备开始阅读 announcement 以查看其中是否有任何建议 "fix" 的内容,但我相信我已在客户端和客户端上正确配置所有内容服务器。我目前的想法是,这是 JVM 中的一个错误。

使用ssltest,只要我使用Java 1.8,我已经能够确认我可以在提供正确的客户端证书时使用多个密码套件与服务器握手。0_181 或 Java 11.0.3(这是我碰巧放在笔记本电脑上进行测试的两个版本)。使用 Java 1.8.0_232.

时,使用相同的文件、命令行等会失败

有人见过这样的东西吗?

更新

我已经从 here 下载了 x86-64 OpenJDK 版本 8u222 和 8u232,我可以确认版本 8u222 可以连接,而 8u232 不会连接。

更新 降级到之前版本的OpenJDK暂时解决了我的问题。我正在使用 Debian Stretch,我可以使用以下命令降级:

$ sudo apt-get install openjdk-8-jdk-headless=8u222-b10-1~deb9u1 openjdk-8-jre-headless=8u222-b10-1~deb9u1

注意我只安装了 "headless" 包,所以我只降级了 "headless" 包。

更新 我可以在这里确认客户证书是一条红鲱鱼。我放宽了对服务器的要求,不需要客户端证书,但初始 TLS 握手仍然失败。我正在尝试将其缩小到我能得到的最简单的测试用例。

更新 仍在尝试诊断问题,在这里。我有一个测试服务器,我可以在其中以各种配置启动它,看看会发生什么。我确定 Java 8u222 支持 secp256k1 曲线,而 Java 8u232 不支持,我得到握手失败。

secp256k1 曲线已被 jdk 8u232 禁用(参见 https://java.com/en/download/faq/release_changes.xml)。它可以通过 java 系统 属性 jdk.tls.namedGroups.

重新启用

常见问题解答中的示例列出了其他一些 过时的 NIST EC 曲线,它们也被禁用了。那里列出的曲线是 sect283k1sect283r1sect409k1sect409r1sect571k1sect571r1secp256k1。系统 属性 jdk.tls.namedGroups 采用逗号分隔的这些名称列表。