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使用自己的签名者信息,而不是应用程序目标类的签名者信息

  • 签名后,访问:dist\lib
  • 找到额外的.jar
  • 使用Winrar,可以提取文件夹(提取到“文件夹名称”)选项
  • 访问权限:META-INF/MANIFEST.MF
  • 删除每个签名,如下所示:
  • 名称:net/sf/jasperreports/engine/util/xml/jaxexpathexecuterfactory.c 少女 SHA-256-Digest:q3B5wW+hLX/+lP2+L0/6wRVXRHq1mISBo1dkixT6Vxc=

  • 保存文件
  • 再拉一下
  • Renaime ext to.jar back
  • 已经

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

    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的上一个答案的启发 需要重新配置导入库的顺序:

  • 右键单击项目
  • 打开[Java构建路径]
  • 单击订单并导出
  • 然后将JUNIT推到更高优先级

  • 我运行的是JUnit5,也引用了Hamcrest外部jar。但是Hamcrest也是JUnit5库的一部分。因此,我必须更改外部Hamecrest jar文件在JUnit5库中的顺序