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使用自己的签名者信息而不是应用程序目标类的签名者信息。
- 签名后,访问:dist \ lib
- find额外的.jar
- 使用Winrar,你提取一个文件夹(解压到“文件夹名称”)选项
- 访问:META-INF / MANIFEST.MF
- 删除每个签名:
名称:net / sf / jasperreports / engine / util / xml / JaxenXPathExecuterFactory.c lass SHA-256-Digest:q3B5wW + hLX / + lP2 + L0 / 6wRVXRHq1mISBo1dkixT6Vxc =
- 保存文件
- 再次拉链
- Renaime转到.jar回来
- 已经
我有一个类似的例外:
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文件名只是例子