【问题标题】:Algorithm constraints check failed on signature algorithm: SHA256WithRSAEncryption签名算法的算法约束检查失败:SHA256WithRSAEncryption
【发布时间】:2021-04-15 22:42:48
【问题描述】:

有时,当服务器尝试使用 https 连接其他服务时,我一直注意到以下错误。要采取什么措施来解决这个问题。有趣的是,它只发生在少数服务器上。

{http://xml.apache.org/axis/}stackTrace:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Algorithm constraints check failed on signature algorithm: SHA256WithRSAEncryption
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1959)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
    ....
    ....
at com.xyz.rest.XyzService.call(XyzService.java:1239)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Algorithm constraints check failed on signature algorithm: SHA256WithRSAEncryption
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1959)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1514)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1072)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
    at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:186)
    at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
    at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:404)
    at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
    ... 22 more
Caused by: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Algorithm constraints check failed on signature algorithm: SHA256WithRSAEncryption
    at sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:362)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:270)
    at sun.security.validator.Validator.validate(Validator.java:260)
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496)
    ... 33 more
Caused by: java.security.cert.CertPathValidatorException: Algorithm constraints check failed on signature algorithm: SHA256WithRSAEncryption
    at org.bouncycastle.jce.provider.RFC3280CertPathUtilities.prepareNextCertO(Unknown Source)
    at org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(Unknown Source)
    at java.security.cert.CertPathValidator.validate(CertPathValidator.java:292)
    at sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:357)
    ... 39 more

【问题讨论】:

  • 那些故障服务器的时钟准时吗?
  • @aran - 是的,这些都设置正确。关于何时发生此错误的任何提示?
  • 我唯一的猜测是 ntp 同步失败,我真的想不出替代方案...您是否尝试完全重新安装 jre,再次设置这些服务器上的所有证书设置?您能否将好的服务器虚拟化并用好的克隆替换故障服务器?

标签: java security ssl webserver pki


【解决方案1】:

请检查受影响服务器中与 TLS 相关的 java 配置,SDK 使用安全属性 jdk.certpath.disabledAlgorithmsjdk.tls.disabledAlgorithm 在 TLS 协议协商期间禁用算法,可能 SHA256WithRSAEncryption 已被禁用。

您可以在 Java 安装的 <install_dir>/jre/lib/security/java.security 文件中找到这些属性的值。

请考虑阅读 this 相关文章,它适用于 IBM SDK 8,但描述的行为对于其他 SDK 版本和供应商应该相同或非常相似。

另外,在受影响的服务器上运行程序时,请考虑启用值为certpathalljava.security.debug 环境属性:

-Djava.security.debug=certpath

它将为您提供有关正在发生的事情以及 Java 为何抱怨该算法的指导和有价值的信息。

【讨论】:

  • 没有。 java.security 中未禁用 SHA256WithRSAEncryption 算法。越来越多的 url 收到此错误“CertPathValidatorException:签名算法的算法约束检查失败:SHA256WithRSAEncryption”。怎么回事?
  • 很遗憾听到这不是问题所在。您是否要在您的程序上启用 SSL 调试?有什么发现吗?请问,您的故障服务器运行的是什么 Java 版本?这不太可能,但正如this SO 问题中所建议的那样,也许某些服务器使用的 JDK 版本比那些在密钥大小方面失败的服务器更宽松。查看下一条评论
  • 另外,还要注意远程服务使用的密码套件,可能其中一些,例如最近的GCM,并非所有SDK版本都支持。例如,您可以在 security-libs 相关工作中找到 this SDK enhancement,该工作仅从 JDK 7u191 开始提供。所有提出的解决方案都已经过时了,但我希望这对您有所帮助。
  • 它可能不在 jdk 中,因为我已经检查了 jdk 版本。所有虚拟机都有相同的 jdk 版本和 tomcat 版本。应用程序代码本身是否是罪魁祸首。因为我们这样做了,所以我们在产品升级时遇到了这个问题。但就 http 库或任何 ssl 基础架构代码而言,似乎没有任何变化。
  • 不看实际代码很难说,但是如果您在产品升级后遇到问题,则问题可能与代码有关。无论如何,请注意问题与 SSL 握手有关,因此请注意这一点。例如,您是否正在执行相互身份验证?如果是这种情况,您的服务器证书可能有问题。如果您能在问题中提供更多背景信息,那就太好了。
【解决方案2】:

谢谢大家,但我找到了这个问题的答案。有一个旧版本的充气城堡jar,升级jar bcprov-jdk15on-1.58.jar 后,“算法约束检查签名算法失败:SHA256WithRSAEncryption”错误不再出现。

【讨论】:

    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多