Java SecurityException:签名者信息不匹配


121

我像往常一样重新编译了我的课程,并突然收到以下错误消息。为什么?我该如何解决?

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)

Answers:


136

当从不同的JAR文件加载属于同一个程序包的类,并且那些JAR文件具有使用不同证书签名的签名时,就会发生这种情况-或更常见的是,至少一个签名了,而其他一个或多个未签名(包括已加载的类)目录中,因为这些AFAIK无法签名)。

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


我使用了相同的证书,但是该证书已过期,如何更新它?
弗兰克(Frank)2010年

34
有人可以向新手解释如何做吗?我从一周前的春天开始使用Java,但是我迷路了。
mghz 2014年

我面临类似的问题,但是它在休眠的jar中。这些罐子没有签名,我仍然面临这个问题。为什么?请参考stackoverflow.com/questions/24386463/...
user613114

有没有使用相同证书对多个罐子进行签名的特定过程?我尝试使用相同的证书对罐子进行签名(一个接一个),但仍然出现以下异常:签名人信息与同一包中其他类的签名人信息不匹配
vegeta 2015年

@vegeta:抱歉,我对签名过程没有任何经验。
Michael Borgwardt'5

45

一种简单的解决方法是尝试更改导入的jar文件的顺序,这可以通过(Eclipse)完成。右键单击您的软件包->构建路径->配置构建路径->参考和库->订购和导出。尝试更改包含签名文件的jar的顺序。


我有一个要测试的签名jar文件,使用相同的包,junit,jre和其他jar测试类文件。月食中哪个顺序正确?不确定我是否尝试了所有组合。但是并没有超出类加载器SecurityException
datafiddler

感谢您使用此解决方案,我只是更改了junit5和hamcrest-all.jar的顺序,现在我的测试又重新开始了:)
Wallnussfolie

41

答:如果使用maven,调试冲突罐子的一种有用方法是:

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.servlet3.0.0.x。

B.其他有用的提示(如何调试安全异常以及如何排除Maven Deps)是在签名者信息不匹配时提出的问题。


我将STS用作IDE,我将控制台切换为maven控制台,并尝试在该命令上运行,但没有任何反应。。。看起来STS / eclipse中的maven控制台仅显示输出,但不接受任何命令。还是我错了?
nanosoft

1
nanosoft,您的问题似乎与STS有关,因此您可以为其创建一个新的顶级问题。mvn确定接受命令行参数。
尤金(Eugene Gr)。Philippov

@ EugeneGr.Philippov有什么关系?dependency:tree所显示的是罐子的版本,与签名者无关
Gavriel

@Gavriel我没有做太多事情,但是当您摆脱冲突时,不会发生异常。
尤金(Eugene Gr)。Philippov

在某些情况下可能是正确的,但在所有情况下并非如此。例如,com.microsoft.azure组中的不同工件似乎是从多个来源编译的,因此其中一些甚至没有相同的版本。并且在大多数情况下,具有多个版本不会产生错误(即使强制执行器插件因此而警告或失败)
Gavriel

23

就我而言,我在库路径:S中复制了BouncyCastle的JAR版本


2
我也一样。删除所有BC罐子并加载正确的版本即可解决。
Broken_Window

1
@Cedric-同样的BouncyCastle对我来说就是案例
nanosoft

就我而言,是因为里面的spring-cloud需要jdk15on,而我在项目中使用bcprov-jdk16。
Glats

8

我有一个类似的例外:

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库)。我只需要从构建路径中删除JUnit,一切都很好。


6

这可能在使用cglib代理的代理中发生,因为CGLIB使用他自己的签名者信息而不是应用程序目标类的签名者信息。


4
如果是这种情况,我们该怎么办?
Leandro 2014年

@Jarek:这里的解决方案是什么?我们可以使用这个解决方案吗?developer.jboss.org/thread/241718
gaurav

@gaurav我们停止使用已签名的罐子。仅Java Web Start才需要它们,而它早已被废弃。
贾里克·普尔兹高斯基(JarekPrzygódzki)

4
  1. 登录后,访问:dist \ lib
  2. 查找额外的.jar
  3. 使用Winrar,您提取一个文件夹(提取为“文件夹名称”)选项
  4. 访问:META-INF / MANIFEST.MF
  5. 像这样删除每个签名:

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

  1. 保存文件
  2. 再次压缩
  3. Renaime ext扩展为.jar返回
  4. 已经

根据您的建议,我遇到了一些问题:stackoverflow.com/questions/33988136/…–

2

如果您正在Eclipse中运行它,请检查添加到构建路径中的所有项目的jar;否则,请检查它们。或执行control-shift-T并扫描匹配相同名称空间的多个jar。然后从项目的构建路径中删除多余或过时的jar。


2

我在Eclipse和JUnit 5中遇到这个问题。我的解决方案受到user2066936先前回答的启发,它是重新配置导入库的顺序:

  1. 右键单击该项目。
  2. 打开[Java构建路径]。
  3. 单击订购并导出。
  4. 然后将JUNIT推到最高优先级。

1

就我而言,这是程序包名称冲突。当前的项目和已签名的参考库有一个共同的软件包package.foo.utils。只是将当前项目中容易出错的程序包名称更改为其他名称。


1

线程太旧了,但是由于我在此问题上停留了很长时间,因此可以解决此问题(希望它对某人有帮助)

我的情况:

程序包名称为:com.abc.def。有2个jar文件,其中包含该程序包中的类,例如jar1和jar2,即jar1中存在一些类,jar2中存在其他类。这些jar文件使用相同的密钥库签名,但是在构建中的不同时间(即分别)签名。这似乎导致jar1和jar2中文件的签名不同。

我将所有文件放在jar1中,并一起构建(并签名)它们。问题解决了。

PS:程序包名称和jar文件名称仅是示例


1

如果您从bouncycastle.org添加了所有jar(在我的情况下从crypto-159.zip中添加),则只需删除不适用于您的JDK的jar。有冗余。您可能只需要“ jdk15on”罐子。


这正是我的问题,我正在将BC应用程序部署在已在其共享libs文件夹中具有自定义签名版本的应用程序服务器中,解决方案是删除它们并使用更新的版本。
GChiappe

1

这个问题已经持续了很长时间,但我想提出一些建议。我一直在应对Spring项目挑战,并在Eclipse IDE中发现了这一挑战。如果您将Maven或Gradle用于Spring Boot Rest API,则必须在构建路径中删除Junit 4或5,并在pom.xml或Gradle构建文件中包含Junit。我想这也适用于yml配置文件。


0

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


对不起,我听不懂。什么样的文件?在我的情况下,错误是由org.jboss.security.xacml.jaxb.PoliciesType类引起的,并且我确定它仅在JBoss EAP 5.2(/EnterprisePlatform-5.2.0/jboss-eap-5.2/ jboss-as / common / lib / jbossxacml.jar)
Leandro,

0

我可以解决。

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

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

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


0

基于@Mohit Phougat响应,如果您正在运行带有@Grab批注的Groovy,则可以尝试对这些批注重新排序。


0

这在使用JUnit +放心+ 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>

0

我正在运行JUNIT 5,并且还引用了Hamcrest外部jar。但是Hamcrest也是JUNIT 5库的一部分。因此,我必须在构建路径中的JUNIT 5库中更改外部Hamecrest jar文件的顺序。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.