java - DH ServerKeyExchange 不符合算法约束

标签 java security ssl encryption cryptography

我们最近升级了我们的一个工具(使用 java 实现),现在它很难连接到我们公司的一个内部端点。对于其他端点,它工作正常。假设它不起作用的端点是 xyz.abc.com
我们每次看到的错误是

javax.net.ssl.SSLHandshakeException: DH ServerKeyExchange does not comply to algorithm constraints
        at sun.security.ssl.Alert.createSSLException(Alert.java:131)
        at sun.security.ssl.Alert.createSSLException(Alert.java:117)
        at sun.security.ssl.TransportContext.fatal(TransportContext.java:311)
        at sun.security.ssl.TransportContext.fatal(TransportContext.java:267)
        at sun.security.ssl.TransportContext.fatal(TransportContext.java:258)
        at sun.security.ssl.DHServerKeyExchange$DHServerKeyExchangeConsumer.consume(DHServerKeyExchange.java:540)
        at sun.security.ssl.ServerKeyExchange$ServerKeyExchangeConsumer.consume(ServerKeyExchange.java:111)
        at sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:377)
        at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)
        at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:422)
        at sun.security.ssl.TransportContext.dispatch(TransportContext.java:182)
        at sun.security.ssl.SSLTransport.decode(SSLTransport.java:149)
        at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1143)
        at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1054)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:394)
        at sun.security.ssl.SSLSocketImpl.ensureNegotiated(SSLSocketImpl.java:708)
        at sun.security.ssl.SSLSocketImpl.access$100(SSLSocketImpl.java:72)
        at sun.security.ssl.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:961)
        at sun.security.ssl.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:933)

我遵循了以下建议:-
What does "Reason: DHPublicKey does not comply to algorithm constraints" mean?
然而,这似乎并没有奏效。
由于这个问题现在只是在我们升级工具之后才普遍存在,我们想知道这是否可能是由于执行了新的 jvm 安全限制,有没有什么我们可以作为 jvm 参数传递或者可能只是在 java.security 文件下修改或其他地方来修复这个烦人的错误。我们不想更改该端点使用的证书上的任何内容。
我是密码学的新手,因此在这里的任何帮助或建议都将一如既往地受到赞赏。

最佳答案

就像分享给那些也遇到同样问题并且没有运气改变一个值的人。
很有可能

  • 您的端点的证书使用 DH key 大小 1024。
  • 在 java.security 中,jdk.tls.disabledAlgorithms 设置为禁用 DH keySize < 2048

  • 在这种情况下,包含“jdk.tls.disabledAlgorithms=DH keySize < 1024”的原始解决方案有效。
    在类似 Linux 的环境中,您可以验证用于签署主机证书的 DH key 大小。
    openssl s_client -connect <host>:<port> -msg
    
    你应该从上面的结果中找到这一行

    Server Temp Key: DH, 1024 bits


    对于那些发现单独更新 java.security 文件并没有成功的人来说,很可能有一个外部文件覆盖了某些设置。在 java.security 中查找以下设置。要么将此配置设置为 false,要么像原始帖子一样更新外部文件。

    security.overridePropertiesFile=true


    虽然 Oracle 不鼓励使用较弱的加密算法,但是否/何时遵循套件取决于您。
    Oracle JRE and JDK Cryptographic Roadmap

    关于java - DH ServerKeyExchange 不符合算法约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64989823/

    相关文章:

    java - 如何让 PrintWriter 写入 UTF-8?

    web-services - Glassfish 上的安全 Web 服务客户端

    .net - 身份验证和 REST

    java - 如何检查电子邮件是否确实存在

    ssl - 握手失败: SSL Alert number 40

    java - 在网络应用程序中使用 apache spark 作为缓存

    java - 如何在jME3 SDK中安装jVi插件?

    java - 如何在 GGTS (Groovy Grails Tools Suite) 中正确配置 JDK 位置

    sql-server - SQL Server SSL + TDE 与始终加密

    PHP PDO SSL MySQL 连接失败