Java SecurityException:签名者信息不匹配
Posted
技术标签:
【中文标题】Java SecurityException:签名者信息不匹配【英文标题】:Java SecurityException: signer information does not match 【发布时间】:2011-02-22 01:34:04 【问题描述】:我像往常一样重新编译了我的类,突然收到以下错误消息。为什么?我该如何解决?
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)
【问题讨论】:
这能回答你的问题吗? hamcrest tests always fail 【参考方案1】:当属于同一个包的类从不同的 JAR 文件加载,并且这些 JAR 文件具有使用不同证书签名的签名时,就会发生这种情况 - 或者,更常见的情况是,至少有一个已签名,而其他一个或多个未签名(即包括从目录加载的类,因为这些 AFAIK 无法签名)。
因此,要么确保所有 JAR(或至少包含来自相同包的类)都使用相同的证书进行签名,要么从具有重叠包的 JAR 文件的清单中删除签名。
【讨论】:
我用的是同一个证书,但是过期了,怎么续签? 有人可以向新手解释如何做到这一点吗?一周前我开始使用 java 和 spring,我迷路了。 我面临着类似的问题,但它在休眠罐中。这些罐子没有签名,我仍然面临这个问题。为什么?请参考***.com/questions/24386463/… 是否有任何特定过程可以使用相同的证书签署多个 jar。我尝试使用相同的证书(一一)签署 jar,但仍然出现以下异常:签名者信息与同一包中其他类的签名者信息不匹配 @vegeta:抱歉,我对签名程序没有任何经验。【参考方案2】:一种简单的解决方法是尝试更改导入的 jar 文件的顺序,这可以从 (Eclipse) 完成。右键单击您的包 -> 构建路径 -> 配置构建路径 -> 参考和库 -> 订购和导出。尝试更改包含签名文件的 jar 的顺序。
【讨论】:
我有一个签名的jar文件要测试,测试同包、junit、jre、其他jar的class文件。 eclipse 中的正确顺序是什么?不确定我是否尝试了所有组合。但是没有超出类加载器SecurityException 感谢这个解决方案,我刚刚更改了 junit5 和我的 hamcrest-all.jar 的顺序,现在我的测试又开始工作了 :)【参考方案3】:这可能发生在 cglib-instrumented 代理中,因为 CGLIB 使用他自己的签名者信息而不是应用程序目标类的签名者信息。
【讨论】:
如果出现这种情况我们该怎么办? @Jarek:这里的解决方案是什么?我们可以使用这个解决方案吗? developer.jboss.org/thread/241718 @gaurav 我们停止使用签名的 jar。它们仅在 Java Web Start 中需要,但早已被废弃。 旧版本的 Mockito 使用 CGLIB,因此这可能会导致 OP 遇到的类似错误。较新版本的 Mockito 不使用 CGLIB,因此升级版本可以解决此问题。我发布了一个包含更多详细信息的答案。【参考方案4】:-
签名后,访问:dist\lib
查找额外的 .jar
使用 Winrar,您可以提取文件夹(提取到“文件夹名称”)选项
访问:META-INF/MANIFEST.MF
这样删除每个签名:
名称:net/sf/jasperreports/engine/util/xml/JaxenXPathExecuterFactory.c 姑娘 SHA-256-摘要:q3B5wW+hLX/+lP2+L0/6wRVXRHq1mISBo1dkixT6Vxc=
-
保存文件
再次压缩
将 ext 重命名为 .jar 返回
已经
【讨论】:
按照您的建议,我遇到了一些问题:***.com/questions/33988136/…【参考方案5】:如果您两次包含一个具有不同名称或来自不同位置的文件,也会发生这种情况,尤其是当它们是同一文件的两个不同版本时。
【讨论】:
对不起,我不明白。什么样的文件?在我的情况下,错误与 org.jboss.security.xacml.jaxb.PoliciesType 类有关,我确信它仅在 JBoss EAP 5.2 附带的 jar 中(/EnterprisePlatform-5.2.0/jboss-eap-5.2/ jboss-as/common/lib/jbossxacml.jar)【参考方案6】: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 部门)在问题 Signer information does not match 中。
【讨论】:
我使用 STS 作为 IDE,我将控制台切换到 maven 控制台并尝试在那里运行上面的命令,但没有发生任何事情......看起来 STS/eclipse 中的 maven 控制台只是为了显示输出但是不接受任何命令。还是我错了? nanosoft,您的问题似乎与 STS 相关,因此您可以为其创建一个新的***问题。 mvn 肯定接受命令行参数。 @EugeneGr.Philippov 这有什么关系? dependency:tree 显示的是 jar 的版本,与签名者无关 @Gavriel 我没有挖掘太多,但是当你摆脱冲突时,异常不会发生。 在某些情况下可能是这样,但并非全部如此。例如 com.microsoft.azure 组中的不同工件似乎是从多个来源编译的,因此其中一些甚至没有相同的版本。而且在大多数情况下,拥有多个版本不会产生错误(即使执行器插件因此发出警告或失败)【参考方案7】:我可以解决它。
根本原因: 在使用带有签名 jar 的 Sun JAXB 实现时,这是一个常见问题。 本质上,JAXB 实现试图通过生成一个类来直接访问属性而不使用反射来避免反射。不幸的是,它在与被访问的类相同的包中生成了这个新类,这就是这个错误的来源。
分辨率: 添加以下系统属性以禁用与签名 jar 不兼容的 JAXB 优化: -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
参考:https://access.redhat.com/site/solutions/42149
【讨论】:
【参考方案8】:就我而言,我在库路径中复制了 JAR 版本的 BouncyCastle:S
【讨论】:
同样的事情发生在我身上。删除所有 BC jar 并加载正确的版本解决了它。 @Cedric - 同样的 BouncyCastle 是我的情况 在我的情况下是因为 spring-cloud inside 需要 jdk15on 而我在我的项目中使用 bcprov-jdk16。【参考方案9】:如果您在 Eclipse 中运行它,请检查添加到构建路径的任何项目的 jar;或执行 control-shift-T 并扫描与同一命名空间匹配的多个 jar。然后从项目的构建路径中删除多余或过时的 jar。
【讨论】:
【参考方案10】:根据@Mohit Phugat 响应,如果您正在运行带有@Grab 注释的Groovy,您可以尝试重新排序这些注释。
【讨论】:
【参考方案11】:在我的情况下,这是一个包名冲突。当前项目和签名的引用库有一个共同的包package.foo.utils
。只是将当前项目容易出错的包名称更改为其他名称。
【讨论】:
【参考方案12】:有点旧线程,但由于我在此问题上卡了很长时间,这是修复(希望对某人有所帮助)。
我的场景:
包名是:com.abc.def。有 2 个 jar 文件包含此包中的类,例如 jar1 和 jar2,即 jar1 中存在一些类,而 jar2 中存在其他类。这些 jar 文件使用相同的密钥库进行签名,但在构建中的不同时间(即分别)。这似乎导致 jar1 和 jar2 中的文件的签名不同。
我将所有文件放在 jar1 中并一起构建(并签名)它们。问题消失了。
PS:包名和jar文件名只是例子
【讨论】:
【参考方案13】:我也有类似的例外:
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,一切都很好。
【讨论】:
【参考方案14】:如果您添加了来自 bouncycastle.org 的所有 jar(在我的情况下来自 crypto-159.zip),只需删除不适用于您的 JDK 的那些。有裁员。您可能只需要“jdk15on”罐子。
【讨论】:
这正是我的问题,我在应用程序服务器中部署了一个 BC 应用程序,该应用程序服务器的共享库文件夹中已经有相同的自定义签名版本,解决方案是删除它们并使用较新的.【参考方案15】:这个问题已经持续了很长时间,但我想提出一些问题。我一直在处理 Spring 项目挑战,我在 Eclipse IDE 中发现了这一点。如果您将 Maven 或 Gradle 用于 Spring Boot Rest API,则必须删除构建路径中的 Junit 4 或 5,并将 Junit 包含在您的 pom.xml 或 Gradle 构建文件中。我想这也适用于 yml 配置文件。
【讨论】:
【参考方案16】:这发生在我使用 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>
【讨论】:
能否请您评论 pom.xml 示例? junit 被添加到构建路径中【参考方案17】:我在使用 Eclipse 和 JUnit 5 时遇到了这个问题。 我的解决方案受到 user2066936 先前答案的启发 就是重新配置导入库的顺序:
-
右键单击项目。
打开 [Java 构建路径]。
点击订购和导出。
然后将 JUNIT 推到最高优先级。
【讨论】:
【参考方案18】:我正在运行 JUNIT 5 并且还引用了 Hamcrest 外部 jar,但 Hamcrest 也是 JUNIT 5 库的一部分。因此,我将外部 Hamcrest jar 文件的顺序移到了构建路径中 JUNIT 5 库的上方。
【讨论】:
【参考方案19】:我在尝试使用 Mockito 时遇到了类似的错误:
"$$FastClassByMockitoWithCGLIB$$abb8f5a0"'s signer information does not match signer information of other classes in the same package"
我使用的是旧版本的 Mockito,升级到最新版本的 Mockito 解决了这个问题。如其他答案之一所述,问题出在CGLIB上。在较新的版本中,Mockito 将 CGLIB 替换为 ByteBuddy,因此问题就消失了。我还必须将新的 ByteBuddy jar 添加到 Eclipse 的类路径中,以使 Mockito 再次工作。
【讨论】:
以上是关于Java SecurityException:签名者信息不匹配的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.SecurityException: GoogleCertificatesRslt: 使用调试密钥签名的包 (go/gsrlt)
尝试签署 ANDROID 应用程序时出现异常 - “java.lang.SecurityException:Manifest 主要属性的签名文件摘要无效”
SecurityException:对签名 APK 上的错误接口的 Binder 调用
创建的jar包无法运行,出现java.lang.SecurityException: Invalid signature file digest for Manifest main attribute
创建的jar包无法运行,出现java.lang.SecurityException: Invalid signature file digest for Manifest main attribute