Java SecurityException:签名者信息不匹配

时间:2010-05-20 19:47:11

标签: 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.java:776)

18 个答案:

答案 0 :(得分:122)

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

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

答案 1 :(得分:42)

一个简单的方法就是尝试更改导入的jar文件的顺序,这可以从(Eclipse)完成。右键单击您的包裹 - >构建路径 - >配置构建路径 - >参考文献和图书馆 - >订单和出口。尝试更改包含签名文件的jar的顺序。

答案 2 :(得分:38)

一个。如果您使用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)是Signer information does not match的问题。

答案 3 :(得分:21)

就我而言,我的库路径中有重复的JAR版本的BouncyCastle:S

答案 4 :(得分:7)

我有一个类似的例外:

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,一切都很好。

答案 5 :(得分:6)

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

答案 6 :(得分:4)

  1. 签名后,访问:dist \ lib
  2. 查找额外的.jar
  3. 使用Winrar,您提取文件夹(提取到“文件夹名称”)选项
  4. 访问:META-INF / MANIFEST.MF
  5. 删除每个签名:
  6. 名称:net / sf / jasperreports / engine / util / xml / JaxenXPathExecuterFactory.c  姑娘 SHA-256-Digest:q3B5wW + hLX / + lP2 + L0 / 6wRVXRHq1mISBo1dkixT6Vxc =

    1. 保存文件
    2. 再次拉链
    3. Renaime ext to .jar back
    4. 已经

答案 7 :(得分:2)

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

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

答案 8 :(得分:2)

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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

有点太旧了,但是因为我在这个问题上停留了很长时间,所以这里有修复(希望它对某人有帮助)

我的情景:

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

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

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

答案 11 :(得分:0)

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

enter image description here

答案 12 :(得分: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>

答案 13 :(得分:0)

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

答案 14 :(得分:0)

如果您添加了bouncycastle.org的所有罐子(在我的情况下来自crypto-159.zip),只需删除那些不适用于您的JDK。有裁员。你可能只需要&#34; jdk15on&#34;广口瓶中。

答案 15 :(得分:0)

基于@Mohit Phougat响应,如果您使用@Grab注释运行Groovy,则可以尝试重新排序此类注释。

答案 16 :(得分:0)

我可以解决它。

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

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

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

答案 17 :(得分:0)

如果您包含一个具有不同名称的文件或两次来自不同位置的文件,也会发生这种情况,特别是如果它们是同一文件的两个不同版本。