java.security.cert.CertificateException: Certificates 不符合算法约束原始键更改为

2022-09-01 04:47:39

我有一个制图应用程序,可以在给定 URL 的情况下添加 ArcGIS 9.3+ 底图。我想添加的一个URL来自客户的URL,并且是安全的。我的映射应用程序以前使用Java 6,并且能够毫无问题地添加安全URL。我现在升级到Java 7,并且正在获得一个

"java.security.cert.CertificateException: Certificates does not conform to algorithm constraints"

例外。起初,我认为情况确实如此,因为在Java 7中,默认情况下,用于签署SSL证书的算法被禁用。您可以在 java.security 文件中看到这一点:MD2

"jdk.certpath.disabledAlgorithms=MD2"

但是当我检查该URL时,它说.更奇怪的是,如果我注释掉了文件中的行,URL将毫无问题地工作。在 SSL 过程中是否在其他地方使用?我在这里错过了什么吗?Certification Signature AlgorithmSHA-1"jdk.certpath.disabledAlgorithms=MD2"java.securityMD2


答案 1

背景

MD2 被广泛认为是不安全的,因此在 JDK 6u17 版本(请参阅发行说明 http://www.oracle.com/technetwork/java/javase/6u17-141447.html“在证书链验证中禁用 MD2”)以及 JDK 7(根据您在 中指出的配置)中被禁用。java.security

威瑞信将 3 类根证书与签名算法(串行 )一起使用,但已弃用它,并将其替换为具有相同密钥和名称但使用算法签名的另一个证书。但是,一些服务器在SSL握手期间仍然发送旧的MD2签名证书(具有讽刺意味的是,我在Verisign运行的服务器上遇到了这个问题!md2WithRSAEncryption70:ba:e4:1d:10:d9:29:34:b6:38:ca:7b:03:cc:ba:bfsha1WithRSAEncryption

您可以通过从服务器获取证书链并对其进行检查来验证是否属于这种情况:

openssl s_client -showcerts -connect <server>:<port>

最新版本的 JDK(例如 6u21 和所有已发布的 7 版本)应该通过自动删除与受信任锚点具有相同颁发者和公钥的证书(默认情况下在 cacerts 中)解决此问题。

如果您在使用较新的 JDK 时仍遇到此问题

检查您是否有实现旧接口的自定义信任管理器。JDK 7+应该与此接口兼容,但是根据我对信任管理器实现而不是更新(文档)的调查,JDK使用自己的包装器()并以某种方式绕过了此问题的内部修复程序。X509TrustManagerX509TrustManagerX509ExtendedTrustManagerAbstractTrustManagerWrapper

解决方案是:

  1. 使用缺省信任管理器,或

  2. 修改自定义信任管理器以直接扩展(简单的更改)。X509ExtendedTrustManager


答案 2

Eclipse 无法连接到 SVN https 存储库(也应该适用于使用 SSL/TLS 的任何应用程序)。

svn: E175002: 连接已关闭: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Certificates 不符合算法约束

此问题是由禁用 MD5 相关算法的最新 Java 8 OpenJDK 更新引起的。作为颁发新证书(如果有的话)之前的解决方法,请在 java.security 文件中更改以下密钥

警告
请记住,这可能会带来安全隐患,因为禁用的算法被视为弱算法。作为替代方案,可以通过命令行选项在JVM的基础上应用变通办法,以使用具有此更改的外部java.security文件,例如:

对于Eclipse,在eclipse上添加一行.ini在-vmargs下方java -Djava.security.properties=/etc/sysconfig/noMD5.java.security
-Djava.security.properties=/etc/sysconfig/noMD5.java.security

原始键

jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024
jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768

更改为

jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768

java.security 文件位于 linux 64 中的 /usr/lib64/jvm/java/jre/lib/security/java.security。