Java 11 + Chrome/Firefox = TLS解密错误

yet*_*498 12 java ssl java-11

我目前正在将一些服务器软件从Java 8迁移到Java 11.除了当我的服务器在Java 11(并且只有11)上运行时拒绝TLS连接这一事实以外,一切正常.即,当运行到Java 10时,一切正常.一旦切换到Java 11(当然绝对没有代码更改)我得到TLS解密错误.我的应用程序工作正常,否则我禁用SSL/TLS或当我使用IE/Edge连接到我的服务器(通过TLS).使用Chrome 70或Firefox 62时,我分别得到ERR_SSL_PROTOCOL_ERRORSEC_ERROR_BAD_SIGNATURE.

我尝试使用WireShark进行分析(请参阅我的转储).我的结论是Java 11和Chrome/Firefox协商了一个糟糕的密码套件(rsa_pss_rsae_sha256),它在某种程度上不适用于Java 11. Java 8和IE/Edge似乎协商了一个不同的密码套件(rsa_pkcs1_sha256),这是有效的.

有人知道如何解决这个问题或者至少解决这个问题(当然除了禁用SSL/TLS或使用IE/Edge之外)?提前致谢.

And*_*own 2

这可能是 TLS 1.3 中新 PSS 算法的兼容性故障。您可以在此处阅读有关引入 PSS 背后推理的详细解释。

lib/security/java.security在修复此问题之前,您可以通过编辑TLSv1.3 并将其添加到属性来阻止服务器协商 TLS 1.3 jdk.tls.disabledAlgorithms

  • 我尝试了你的解决方案。当我禁用 TLS 1.3(和 1.2)时,它不起作用,因为我的 JDK 以某种方式回退到 TLS 1.0,然后继续抛出大量异常。当我禁用 RSA-PSS 时(通过将 `RSA(SSA)?[-_]PSS` 的所有可能变体插入到 `jdk.tls.disabledAlgorithms` 中),我**确实**设法让它工作。所以谢谢! (4认同)
  • @sergiofbsilva 您需要将 `, RSASSA-PSS` 附加到 `${JAVA_HOME}/conf/security/java.security` 中的 `jdk.jar.disabledAlgorithms` 中,以禁用 OpenJDK 11 中使用此算法的所有损坏的签名方案。我还找到了相应的错误报告https://bugs.openjdk.java.net/browse/JDK-8216039。我还想发布实际的错误消息以帮助其他人找到此解决方案:“javax.net.ssl.SSLHandshakeException:收到致命警报:decrypt_error”。仅当启用了“javax.net.debug”系统属性(我使用“-Djavax.net.debug=all”)时才能看到此错误消息。 (2认同)