有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java DH ServerKeyExchange不符合算法约束

我们最近升级了一个工具(使用java实现),现在很难连接到我们公司的一个内部端点。对于其他端点,它可以正常工作。假设它不工作的端点是xyz。美国广播公司。通用域名格式 我们每次看到的错误是

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下进行修改。安全文件或其他文件来修复此恼人的错误。我们不想更改该端点使用的证书上的任何内容。 我是一名密码学新手,因此,如有任何帮助或建议,我们将一如既往地不胜感激


共 (2) 个答案

  1. # 1 楼答案

    我可以通过修改java加密策略来解决这个问题:

    jdk.tls.ephemeralDHKeySize=1024
    jdk.certpath.disabledAlgorithms=MD2, MD5, DSA, RSA keySize < 2048
    jdk.tls.disabledAlgorithms=DH keySize < 1024, SSLv2, SSLv3, TLSv1, TLSv1.1, DHE_DSS, RSA_EXPORT, DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_DSS_EXPORT, DH_RSA_EXPORT, DH_anon, ECDH_anon, DH_RSA, DH_DSS, ECDH, 3DES_EDE_CBC, DES_CBC, RC4_40, RC4_128, DES40_CBC, RC2, HmacMD5
    jdk.tls.legacyAlgorithms=

    对于DHKeySize,我不得不将2048替换为1024

  2. # 2 楼答案

    就像分享给那些遇到同样问题的人一样,他们没有机会改变一个价值观

    很有可能

    • 端点的证书使用的是DH keysize 1024
    • 在爪哇。安全,jdk。tls。disabledAlgorithms设置为禁用DH keySize<;2048年

    在这种情况下,包含“jdk.tls.disabledAlgorithms=DH keySize<;1024”的原始解决方案起到了作用

    在类似Linux的环境中,您可以验证用于签署主机证书的DH keysize

    openssl s_client -connect <host>:<port> -msg
    

    你应该从上面的结果中找到这条线

    Server Temp Key: DH, 1024 bits

    对于那些发现更新java的人。安全文件本身并不能解决这个问题,可能有一个外部文件覆盖了某些设置。在java中查找以下设置。安全要么将此配置设置为false,要么像原始帖子那样更新外部文件

    security.overridePropertiesFile=true

    虽然Oracle不鼓励使用更弱的加密算法,但是否/何时使用该套件取决于您

    Oracle JRE and JDK Cryptographic Roadmap