我们最近升级了我们的一个工具(使用 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 文件下修改或其他地方来修复这个烦人的错误。我们不想更改该端点使用的证书上的任何内容。
我是密码学的新手,因此在这里的任何帮助或建议都将一如既往地受到赞赏。
最佳答案
就像分享给那些也遇到同样问题并且没有运气改变一个值的人。
很有可能
在这种情况下,包含“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/