Java SecurityException:签名者信息不匹配

像往常一样重新编译我的类,并突然得到以下错误信息。 为什么? 我该如何解决?

java.lang.SecurityException: class "Chinese_English_Dictionary"'s signer information does not match signer information of other classes in the same package at java.lang.ClassLoader.checkCerts(ClassLoader.java:776) 

当属于同一个包的类从不同的JAR文件中加载时,会发生这种情况,并且这些JAR文件具有使用不同的证书签名的签名 – 或者更常见的是,至less有一个签​​名,一个或多个不是(包括加载的类从这些AFAIK无法签名的目录)。

因此,要么确保所有JAR(或者至less包含来自相同包的类的JAR)使用相同的证书进行签名,要么从包含重叠包的JAR文件的清单中删除签名。

一个简单的方法就是尝试改变导入的jar文件的顺序,这可以从(Eclipse)中完成。 右键单击你的包 – > Build Path – > Configure build path – > References and Libraries – > Order and Export。 尝试更改包含签名文件的jar包的顺序。

答:如果你使用maven,debugging碰撞瓶子的一个有用的方法是:

 mvn dependency:tree 

例如,对于一个例外:

 java.lang.SecurityException: class "javax.servlet.HttpConstraintElement"'s signer information does not match signer information of other classes in the same package 

我们的确是:

 mvn dependency:tree|grep servlet 

其输出:

 [INFO] +- javax.servlet:servlet-api:jar:2.5:compile [INFO] +- javax.servlet:jstl:jar:1.2:compile [INFO] | +- org.eclipse.jetty.orbit:javax.servlet.jsp:jar:2.2.0.v201112011158:compile [INFO] | +- org.eclipse.jetty.orbit:javax.servlet.jsp.jstl:jar:1.2.0.v201105211821:compile [INFO] | +- org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:compile [INFO] +- org.eclipse.jetty:jetty-servlet:jar:9.0.0.RC2:compile 

显示冲突的servlet-api 2.5和javax.servlet 3.0.0.x.

B.其他有用的提示(如何debugging安全exception和如何排除maven deps)是在签署者信息的问题不匹配 。

在我的情况下,我在我的库path中复制了JAR版本的BouncyCastle:S

使用cglib-instrumented代理可能会发生这种情况,因为CGLIB使用自己的签名者信息而不是应用程序目标类的签名者信息。

  1. 签名后,访问:dist \ lib
  2. find额外的.jar
  3. 使用Winrar,你提取一个文件夹(解压到“文件夹名称”)选项
  4. 访问:META-INF / MANIFEST.MF
  5. 删除每个签名:

名称:net / sf / jasperreports / engine / util / xml / JaxenXPathExecuterFactory.c lass SHA-256-Digest:q3B5wW + hLX / + lP2 + L0 / 6wRVXRHq1mISBo1dkixT6Vxc =

  1. 保存文件
  2. 再次拉链
  3. Renaime转到.jar回来
  4. 已经

我有一个类似的例外:

 java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package 

根本问题是我把Hamcrest图书馆包括了两次。 一旦使用Maven pom文件。 而且我还将JUnit 4库(也包含一个Hamcrest库)添加到项目的构buildpath中。 我只需要从构buildpath中删除JUnit,一切都很好。

如果您在Eclipse中运行它,请检查添加到构buildpath的任何项目的jar包; 或者做control-shift-T并扫描匹配相同命名空间的多个jar。 然后从项目的构buildpath中删除多余的或过时的jar子。

在我的情况下,这是一个包名冲突。 当前项目和已签名的引用库有一个共同的package.foo.utils 。 只是改变了当前项目容易出​​错的软件包名称。

如果您使用不同名称或不同位置两次包含一个文件,尤其是在同一文件的两个不同版本时,也会发生这种情况。

我可以修复它。

根本原因:将Sun JAXB实现与带签名的jar一起使用时,这是一个常见问题。 本质上,JAXB实现试图通过生成一个类来直接访问属性而不使用reflection来避免reflection。 不幸的是,它在与被访问的类相同的包中生成这个新的类,这个错误来自于这个类。

解决scheme:添加以下系统属性以禁用与签名jar不兼容的JAXB优化:-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize = true

参考: https : //access.redhat.com/site/solutions/42149

基于@Mohit Phougat响应,如果您使用@Grab注释运行Groovy,则可以尝试重新sorting这些注释。

有点太旧的线程,但因为我在这方面被困了一段时间,这里的修复(希望它可以帮助某人)

我的场景:

包名是:com.abc.def。 有2个jar文件包含来自这个软件包的类,比如说jar1和jar2,即jar1和jar2中有一些类。 这些jar文件是使用相同的密钥库进行签名的,但在构build时(即单独)在不同的时间。 这似乎导致jar1和jar2中的文件签名不同。

我把所有的文件放在jar1中,并把它们一起构build(并签名)。 问题消失了。

PS:包名和jar文件名只是例子