【问题标题】:DH ServerKeyExchange does not comply to algorithm constraintsDH ServerKeyExchange 不符合算法约束
【发布时间】:2020-11-24 15:40:31
【问题描述】:

我们最近升级了我们的一个工具(使用 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 文件或其他地方来修复这个恼人的错误。我们不想更改该端点使用的证书上的任何内容。 我是密码学的新手,因此我们将一如既往地感谢您提供任何帮助或建议。

【问题讨论】:

  • 您能分享您的客户端 ssl 配置吗?
  • 你的意思是我的 java 安装中的 java.security 文件?
  • 不完全是...所以我感觉您的应用程序正在尝试执行 https 请求。如果是这种情况,您使用的是 http 客户端。那是什么类型的客户端,您是如何配置该客户端的 ssl 属性的。
  • 它的 jenkins 工具试图通过 SSL 握手建立与内部端点的连接。由于 SSL 握手失败并出现这些错误,我尝试直接从该工具使用的 java 执行 SSLPoke,但它失败了有同样的错误 java SSLPoke my-endpoint port

标签: java security ssl encryption cryptography


【解决方案1】:

只是分享给那些也遇到同样问题却没有运气改变一个值的人。

很有可能

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

在这种情况下,包含“jdk.tls.disabledAlgorithms=DH keySize

在类似 Linux 的环境中,您可以验证用于签署主机证书的 DH 密钥大小。

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

你应该从上面的结果中找到这一行

服务器临时密钥:DH,1024 位

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

security.overridePropertiesFile=true

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

Oracle JRE and JDK Cryptographic Roadmap

【讨论】:

    【解决方案2】:

    我可以通过修改 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

    【讨论】:

    • 它不能解决我的问题。我们应该在此更改后重新启动任何服务吗?
    【解决方案3】:

    在 Red Hat Enterprise Linux 8.5 系统上,我通过像这样将系统设置为 LEGACY 模式解决了这个问题。更多信息在这里https://access.redhat.com/articles/3666211

    $ update-crypto-policies --show
    DEFAULT
    
    $ sudo update-crypto-policies --set LEGACY
    Setting system policy to LEGACY
    Note: System-wide crypto policies are applied on application start-up.
    It is recommended to restart the system for the change of policies
    to fully take place.
    
    $ sudo reboot
    

    【讨论】:

      猜你喜欢
      • 2018-01-02
      • 2023-03-14
      • 2016-11-06
      • 2020-03-06
      • 2017-08-13
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多