java.security.cert.CertificateException:证书不符合算法约束

jam*_*mes 35 java ssl arcgis arcgis-server java-7

我有一个地图应用程序,可以在给定URL的情况下添加ArcGIS 9.3+基本地图.我想添加的其中一个网址来自客户的网址并受到保护.我的地图应用程序之前使用的是Java 6,并且能够无问题地添加安全URL.我现在升级到Java 7并且正在获得一个

"java.security.cert.CertificateException: Certificates does not conform to algorithm constraints"
Run Code Online (Sandbox Code Playgroud)

例外.起初,我认为情况就是这样,因为在Java 7中,默认情况下,MD2禁用签署SSL证书的算法.您可以在java.security文件中看到:

"jdk.certpath.disabledAlgorithms=MD2"
Run Code Online (Sandbox Code Playgroud)

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

Ram*_*man 51

背景

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

Verisign使用带有md2WithRSAEncryption签名算法(序列70:ba:e4:1d:10:d9:29:34:b6:38:ca:7b:03:cc:ba:bf)的Class 3根证书,但弃用它并将其替换为具有相同密钥和名称但使用算法签名的另一个证书sha1WithRSAEncryption.但是,有些服务器仍然在SSL握手期间发送旧的MD2签名证书(具有讽刺意味的是,我遇到了Verisign运行的服务器的这个问题!).

您可以通过以下方式验证是否属于这种情况:

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

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

如果新JDK仍然存在此问题

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

解决方案是:

  1. 使用默认信任管理器,或

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

  • openssl s_client ...命令不仅非常有用,而且我的6小时痛苦和痛苦的解决方案是X509ExtendedTrustManager更改. (7认同)
  • 更改为_X509ExtendedTrustManager_是有史以来最好的解决方案.非常感谢. (5认同)

Lui*_*ñoz 27

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

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

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

警告
请记住,这可能会产生安全隐患,因为禁用的算法被认为是弱的.作为替代方案,可以通过命令行选项在JVM基础上应用变通方法,以使用具有此更改的外部java.security文件,例如:
java -Djava.security.properties=/etc/sysconfig/noMD5.java.security
对于Eclipse,在eclipse.ini下面添加一行-vmargs
-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
Run Code Online (Sandbox Code Playgroud)

改成

jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768
Run Code Online (Sandbox Code Playgroud)

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


小智 9

在Fedora 28上,只需注意该行

security.useSystemPropertiesFile = true

在的java.security文件,发现在:

$(目录名$(readlink -f $(其中java)))/../ lib / security / java.security

Fedora 28在以下位置引入了disabledAlgorithms控件的外部文件

/etc/crypto-policies/back-ends/java.config

您可以编辑此外部文件,也可以java.security通过设置将其排除在外

security.useSystemPropertiesFile = false


小智 1

发生这种情况的可能性更大,因为您的证书链中的某个位置有一个证书,更可能是旧根,它仍然使用 MD2RSA 算法签名。

您需要在证书存储中找到它并将其删除。

然后返回您的证书颁发机构并向他们询问新的根。

它更可能是具有相同有效期的相同根,但已通过 SHA1RSA 重新认证。

希望这有帮助。