Java SecurityException:签名者信息不匹配
我像往常一样重新编译了我的类,突然收到以下错误消息。为什么?我怎样才能修好它Java SecurityException:签名者信息不匹配,java,certificate,securityexception,Java,Certificate,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.jav
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文件具有使用不同证书签名的签名时,就会发生这种情况——或者,可能更常见的情况是,至少有一个已签名,而另一个或多个未签名(这包括从目录加载的类,因为这些AFAIK无法签名)
因此,要么确保所有JAR(或至少包含来自相同包的类的JAR)都使用相同的证书进行签名,要么从具有重叠包的JAR文件清单中删除签名。一个简单的解决方法就是尝试更改导入的JAR文件的顺序,这可以从(Eclipse)中完成。右键单击包->构建路径->配置构建路径->引用和库->订购和导出。尝试更改包含签名文件的JAR的顺序。这可能发生在cglib插入指令的代理上,因为cglib使用自己的签名者信息,而不是应用程序目标类的签名者信息
如果两次包含一个具有不同名称或来自不同位置的文件,尤其是同一文件的两个不同版本,也会发生这种情况。A.如果使用maven,调试冲突jar的有用方法是:
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.其他有用的提示(如何调试安全异常以及如何排除maven deps)位于问题所在。我可以修复它
根本原因:
在将Sun JAXB实现与签名JAR一起使用时,这是一个常见问题。
实际上,JAXB实现试图通过生成一个类来避免反射,从而直接访问属性而不使用反射。不幸的是,它在与被访问的类相同的包中生成了这个新类,这就是这个错误的来源
决议:
添加以下系统属性以禁用与签名JAR不兼容的JAXB优化:
-Dcom.sun.xml.bind.v2.bytecode.classtailer.noOptimize=true
Ref:在我的例子中,我在我的库路径中复制了BouncyCastle的JAR版本:S如果您在Eclipse中运行它,请检查添加到构建路径的任何项目的JAR;或者执行control-shift-T并扫描多个与同一名称空间匹配的jar。然后从项目的构建路径中删除多余或过时的jar。基于@Mohit-Phougat响应,如果您正在运行带有@Grab注释的Groovy,您可以尝试重新排序此类注释。在我的例子中,这是一个包名冲突。当前项目和已签名的引用库有一个公共包
package.foo.utils
。刚刚将当前项目易出错的包名称更改为其他名称。有点太旧了,但由于我在这方面遇到了相当长的问题,下面是修复方法(希望它对其他人有所帮助)
我的设想:
程序包名称为:com.abc.def。有两个jar文件包含来自这个包的类,比如jar1和jar2,即一些类存在于jar1中,另一些存在于jar2中。这些jar文件使用相同的密钥库进行签名,但在构建中的不同时间(即分别进行签名)。这似乎导致jar1和jar2中的文件签名不同
我将所有文件放在jar1中,并一起构建(并签名)。问题消失了
PS:包名和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文件后。我还将JUnit4库(其中还包含一个Hamcrest库)添加到项目的构建路径中。我只需从构建路径中删除JUnit,一切都很好。如果您从bouncycastle.org(在我的例子中是从crypto-159.zip)添加了所有JAR,只需删除不适用于您的JDK的JAR即可。有冗余。您可能只需要“jdk15on”罐子。这个问题已经持续了很长时间,但我想介绍一些东西。我一直在从事Spring项目挑战,我在EclipseIDE中发现了这一点。如果您使用Maven或Gradle for Spring Boot Rest API,则必须在构建路径中删除Junit 4或5,并在pom.xml或Gradle构建文件中包含Junit。我想这也适用于yml配置文件 我在使用JUnit+rest assured+hamcrest时遇到了这种情况,在这种情况下,不要将JUnit添加到构建路径中,如果您有maven项目,这就解决了我的问题,下面是pom.xml
<dependencies>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
放心吧
放心
3.0.0
org.hamcrest
汉克雷斯特酒店
1.3
朱尼特
朱尼特
4.12
我在Eclipse和JUnit 5中遇到了这个问题。
我的解决方案受用户2066936的上一个答案的启发
需要重新配置导入库的顺序:
我运行的是JUnit5,也引用了Hamcrest外部jar。但是Hamcrest也是JUnit5库的一部分。因此,我必须更改外部Hamecrest jar文件在JUnit5库中的顺序