包时签名不一致 class “xxxx signer information does not match signer information

文章主要介绍了在Java开发中遇到的类加载器问题,具体表现为两个同名jar包的签名不一致。解决方案包括检查并排除jar冲突,特别是针对org.bouncycastle的bcprov-jdk14和bcprov-jdk15on这两个jar包。通过在pom文件中添加exclusion来避免冲突,确保类路径下的签名匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错:

class "org.bouncycastle.asn1.ASN1Integer"'s signer information does not match signer information of other classes in the same package

本质:类加载器比对两个同名jar包时签名不一致
解决方案:

1、检查项目是否存在jar冲突。通过exclusion排除相关依赖

  • 全局搜索
    在这里插入图片描述

  • pom文件查找
    在这里插入图片描述

<exclusion>
   <groupId>org.bouncycastle</groupId>
   <artifactId>bcprov-jdk14</artifactId>
</exclusion>

2、比对时与包名称无关,与是否包含这个类无关,只要包下的路径相同,就会比对同一个包路径下面的jar包的签名。

例如:类:ASN1Integer
bcprov-jdk15on.jar下路径org.bouncycastle.asn1.ASN1Integer
bcprov-jdk14.jar下路径org.bouncycastle.asn1无此类
包下的路径

完美解决

<think>我们正在处理一个传统非Maven项目(JDK1.8)中的`java.lang.SecurityException`,具体错误信息为类签名一致classsignerinformation doesnot match),涉及Bouncy Castle库的类`org.bouncycastle.asn1.ASN1Integer`。根据引用[^1]和[^2],该异常通常是由于项目中存在多个同版本的Bouncy Castle库(jar冲突)导致的。因为同版本的jar可能由同的证书签名,当JVM加载类发现同一个下的类由同的签名签名,就会抛出此异常。**排查步骤:**1.**检查项目中的Bouncy Castle库:**-在项目的`lib`目录(或存放依赖jar的目录)中,查找所有含`bcprov`、`bcmail`、`bcpkix`等BouncyCastle相关的jar文件。-注意:BouncyCastle库的常见命名格式为`bcprov-jdkXX-xxx.jar`、`bcmail-jdkXX-xxx.jar`等,其中`XX`对应Java版本。2.**确认是否存在多个版本:**-如果发现多个版本的Bouncy Castle库(例如`bcprov-jdk15on-1.68.jar`和`bcprov-jdk15on-1.64.jar`),则很可能导致冲突。3.**检查类加载情况:**-使用以下代码在出现异常的地方打印类加载信息,以确定加载冲突类的类加载器以及jar路径:```javaClassLoader loader= org.bouncycastle.asn1.ASN1Integer.class.getClassLoader();System.out.println("ASN1Integer loadedby:" +loader);//如果是URLClassLoader,可以打印URLsif (loader instanceofjava.net.URLClassLoader) {java.net.URL[]urls= ((java.net.URLClassLoader) loader).getURLs();for (java.net.URLurl :urls) {System.out.println("" +url);}}```-或者在启动JVM添加`-verbose:class`参数,观察冲突类的加载来源。4.**解决冲突:**-**保留单一版本:**删除多余的BouncyCastle库,只保留一个版本(建议使用项目所需的最新稳定版本)。-**注意依赖传递:**虽然是非Maven项目,但如果有其他依赖库内部捆绑了Bouncy Castle,则需要解压这些jar并移除内部的Bouncy Castle类,然后统一使用项目提供的版本。这通常需要手动检查。5.**验证签名:**-使用`jarsigner`工具检查jar的签名信息是否一致:```bashjarsigner -verify -verbose -certsbcprov-jdk15on-1.68.jar```-比较同jar的签名者信息(查看证书详情),确保它们相同。 6. **类加载顺序调整(备选):**-如果无法立即删除多余jar,可以尝试调整类加载顺序(将正确的jar放在类路径前面),但这是根本解决方案,因为同一个类可能被同的类加载器加载,或者同一个类加载器加载了多个jar中的相同类,仍然可能冲突。**注意事项:**- BouncyCastle库需要与JDK版本匹配,例如JDK1.8通常使用`jdk15on`版本(表示兼容Java1.5及以上)。-确保项目中没有重复的类(例如,同一个类出现在多个jar中),即使名和类名相同,但内容同或签名同也会导致此问题。**示例:**假设项目`lib`目录下有: ```bcprov-jdk15on-1.64.jarbcprov-jdk15on-1.68.jar``` 解决方案:移除旧版本(如1.64),只保留1.68版本。如果问题仍然存在,请检查是否有其他依赖(如其他安全库)内嵌了Bouncy Castle类,并考虑排除。§§相关问题§§1.如何检查Java项目中是否存在重复的类? 2.在非Maven项目中如何管理依赖冲突?3.Bouncy Castle库在Java加密中的作用是什么?</think>### 排查解决 Bouncy Castle 类签名冲突异常 #### 问题分析 `java.lang.SecurityException: class signer information does not match` 表明 JVM 检测到同一个中的类被同的证书签名。在传统非 Maven 项目中,常见原因括: 1. **多版本共存**:项目中存在多个同版本的 Bouncy Castle (BC) JAR 2. **混合来源**:同含带签名签名的 BC 库 3. **类加载冲突**:同类加载器加载了签名的同名类 4. **依赖传递**:其他依赖库内嵌了 BC 类(如邮件库、PDF 库等) #### 排查步骤(JDK 1.8 环境) ##### 1. 检查依赖冲突 ```bash # 在项目 lib 目录执行 find . -name "*bc*.jar" -o -name "*bouncy*.jar" | sort ``` - 若输出多个 JAR(如 `bcprov-jdk15on-1.68.jar` 和 `bcprov-jdk16-1.46.jar`),说明存在版本冲突 ##### 2. 验证 JAR 签名 ```bash # 检查指定 JAR 的签名 jarsigner -verify -verbose -certs your_bc_lib.jar | grep "Signed by" ``` - 输出示例: ``` Signed by "CN=Bouncy Castle, OU=... (签名一致)" ``` - **冲突标志**:同 JAR 的签名者信息一致 ##### 3. 检查类加载来源 在异常抛出点添加诊断代码: ```java Class<?> clazz = Class.forName("org.bouncycastle.asn1.ASN1Integer"); System.out.println("Loader: " + clazz.getClassLoader()); System.out.println("Location: " + clazz.getProtectionDomain().getCodeSource().getLocation()); ``` #### 解决方案 ##### 方案 1:统一 BC 版本(推荐) 1. 删除所有 BC 相关 JAR(`bcprov-*.jar`, `bcpkix-*.jar` 等) 2. 从[官网](https://www.bouncycastle.org/latest_releases.html)下载**单一版本**(如 `bcprov-jdk15on-176.jar`) 3. 确保所有模块使用同一 JAR 文件 ##### 方案 2:排除冲突依赖 若冲突来自其他库(如邮件库): 1. 解压冲突 JAR: ```bash unzip problematic-lib.jar -d tmp/ ``` 2. 删除内嵌的 BC 类: ```bash rm -rf tmp/org/bouncycastle/ ``` 3. 重新打: ```bash jar cvf clean-lib.jar -C tmp/ . ``` ##### 方案 3:类加载隔离 在特殊部署场景下: ```java // 创建独立类加载器 URL[] urls = { new URL("file:/path/to/clean-bc.jar") }; ClassLoader bcLoader = new URLClassLoader(urls, null); // 显式用该加载器加载 BC 类 Class<?> asn1Class = bcLoader.loadClass("org.bouncycastle.asn1.ASN1Integer"); ``` #### 预防措施 1. **依赖清单**:维护 `lib/README.txt` 记录各库版本 2. **签名验证**:添加新库执行: ```bash jarsigner -verify -certs new_lib.jar | grep -A 1 "Certificate chain" ``` 3. **启动检测**:在 `main()` 方法首行添加: ```java System.out.println("BC Loader: " + Class.forName("org.bouncycastle.asn1.ASN1Integer") .getClassLoader()); ``` > **关键提示**:BC 库的签名证书在 2016 年更新过[^1],混用 2016 年前后的版本必然导致签名冲突。建议统一使用较新版本(如 1.68+)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值