37

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

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

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

"jdk.certpath.disabledAlgorithms=MD2"

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

4

9 回答 9

53

背景

MD2 被广泛认为是不安全的,因此在 JDK 6u17 版本的 Java 中被禁用(请参阅发行说明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)的第 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(一个简单的更改)。

于 2014-01-05T08:41:51.953 回答
28

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

改成

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

于 2016-02-02T15:27:33.673 回答
16

在 Fedora 28 上,只要注意行

security.useSystemPropertiesFile=true

文件,java.security位于:

$(dirname $(readlink -f $(which java)))/../lib/security/java.security

Fedora 28 引入了 disabledAlgorithms 控制的外部文件

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

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

security.useSystemPropertiesFile=false

于 2018-05-30T18:39:47.540 回答
4

我们无法控制的一个数据库存在这个问题,它需要另一种解决方案(此处列出的那些不起作用)。对于我的我需要:

-Djdk.tls.client.protocols="TLSv1,TLSv1.1"

我认为就我而言,这与强制执行某个命令有关。

于 2017-03-14T23:23:31.843 回答
2

由于此结果是 Google 针对此错误返回的第一个结果,我将补充一点,如果有人想在不更改全局文件 java.security 的情况下更改 java 安全设置(例如,您需要运行一些测试),您可以只需通过 JVM 参数-Djava.security.properties=your/file/path提供一个覆盖安全文件 ,您可以在其中通过覆盖禁用来启用必要的算法。

于 2018-04-03T09:48:54.810 回答
1

这更有可能发生,因为在您的证书链的某个地方,您有一个证书,更有可能是一个旧的根,它仍然使用 MD2RSA 算法签名。

您需要将其定位到您的证书存储中并将其删除。

然后回到您的证书颁发机构并要求他们提供新的根。

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

希望这有帮助。

于 2013-01-15T09:18:13.013 回答
1

同事。

在为我们的 REST API 开发自动化测试期间,我遇到了这个麻烦。JDK 7_80 仅安装在我的机器上。在我安装 JDK 8 之前,一切正常,我有可能获得带有JMeter. 在我安装 JDK 8 之后,噩梦就Certificates does not conform to algorithm constraints开始了。

JMeter 和 Serenity 都没有获得令牌的可能性。JMeter 使用 JDK 库来发出请求。当库调用连接到使用它的端点时,库只会引发异常,而忽略请求。

接下来是注释所有java.security 文件中专用于 disabledAlgorithms 的所有行

C:\Java\jre7\lib\security\java.security
C:\Java\jre8\lib\security\java.security
C:\Java\jdk8\jre\lib\security\java.security
C:\Java\jdk7\jre\lib\security\java.security

然后它终于开始工作了。我知道,这是一种蛮力方法,但这是修复它的最简单方法。

# jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768
# jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024
于 2017-01-19T19:19:18.000 回答
0

在 docker 中使用 openjdk-7 我已经安装了一个内容为https://gist.github.com/dtelaroli/7d0831b1d5acc94c80209a5feb4e8f1c#file-jdk-security的文件

#Location to mount
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/security/java.security

谢谢@luis-muñoz

于 2018-06-19T19:39:47.097 回答
0

我在 SOAP-UI 中遇到了这个问题,上面没有一个解决方案对我没有帮助。

对我来说正确的解决方案是添加

-Dsoapui.sslcontext.algorithm=TLSv1

在 vmoptions 文件中(在我的情况下是 ...\SoapUI-5.4.0\bin\SoapUI-5.4.0.vmoptions)

于 2018-03-30T14:15:35.377 回答