Java org.bouncycastle.asn1.ASN1ObjectIdentifier';的签名者信息与签名者信息不匹配

Java org.bouncycastle.asn1.ASN1ObjectIdentifier';的签名者信息与签名者信息不匹配,java,maven,itext,Java,Maven,Itext,当我从我的代码库调用PdfEncryptor.encrypt()时,我面临上述异常。因此,我发现这种情况通常是由于itextpdf和bouncycastle jar的错误组合造成的。但我在下面提到 我认为这是正确的 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version&

当我从我的代码库调用
PdfEncryptor.encrypt()
时,我面临上述异常。因此,我发现这种情况通常是由于itextpdf和bouncycastle jar的错误组合造成的。但我在下面提到 我认为这是正确的

   <dependency>
      <groupId>com.itextpdf</groupId>
      <artifactId>itextpdf</artifactId>
      <version>5.1.3</version>
    </dependency>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-jdk16</artifactId>
      <version>1.46</version>
    </dependency> 
    <dependency>
      <groupId>com.test</groupId>
      <artifactId>test</artifactId>
      <version>1.0.0</version>
    </dependency> 

com.itextpdf
itextpdf
5.1.3
org.bouncycastle
bcprov-jdk16
1.46
com.test
测试
1.0.0
我们通过其他项目(测试)间接地依赖itext。 “测试”项目具有以下条目

<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>2.0.4</version>
</dependency>

com.lowagie
文字
2.0.4
堆栈跟踪:

类“org.bouncycastle.asn1.ASN1ObjectIdentifier”的签名者 信息与中其他类的签名者信息不匹配 同一包 位于java.lang.ClassLoader.checkCerts(ClassLoader.java:952) 位于java.lang.ClassLoader.preDefineClass(ClassLoader.java:666) 位于java.lang.ClassLoader.defineClass(ClassLoader.java:794) 位于java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 位于org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2494) 位于org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:860) 位于org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1302) 位于org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167) 请访问com.itextpdf.text.pdf.PdfEncryption.(PdfEncryption.java:147) 位于com.itextpdf.text.pdf.PdfWriter.setEncryption(PdfWriter.java:2041) 位于com.itextpdf.text.pdf.PdfStamper.setEncryption(PdfStamper.java:295) 位于com.itextpdf.text.pdf.PdfStamper.setEncryption(PdfStamper.java:330) 请访问com.itextpdf.text.pdf.PdfEncryptor.encrypt(PdfEncryptor.java:206)


如果你有什么解决办法,请告诉我。这将非常有帮助

您正在混合两个iText版本:一个是2007年6月的过时版本(
com.lowagie
),一个是2011年11月的更新版本(
com.itextpdf
)。这两个不同的iText版本需要不同版本的BouncyCastle。您应该限制自己使用单一版本的iText(最好是2016年的版本),并使用相应的BouncyCastle版本。您将在所使用的iText版本附带的POM中找到所需的BouncyCastle版本。注意,您还必须仔细检查代码部署的位置。某些web服务器附带的BouncyCastle版本与您需要的版本不同。这可能导致不一致。另一个例子是Android。Android附带旧版本的BouncyCastle和需要更新版本的软件与旧版本冲突。这就是为什么iTextG(iText的Android端口)使用SpongyCastle而不是BouncyCastle。除了包名之外,SpongyCastle与BouncyCastle完全相同。这样,SpongyCastle就不会与Android上的BouncyCastle版本发生冲突


长话短说:你说我有下面提到的依赖项,但你的假设是正确的,我认为是错误的,因为你混合了两个不同版本的iText。

你混合了两个版本的iText:一个是指2007年6月我的名字(
com.lowagie
)的过时版本,另一个是更新版本(
com.itextpdf
)从2011年11月开始。这两个不同的iText版本需要不同版本的BouncyCastle。您应该限制自己使用单一版本的iText(最好是2016年的版本)并使用相应的BouncyCastle版本。您将在正在使用的iText版本附带的POM中找到所需的BouncyCastle版本。请注意,您还必须仔细检查代码的部署位置。某些web服务器附带的BouncyCastle版本与您需要的版本不同。这可能导致o不一致。另一个例子是Android。Android附带旧版本的BouncyCastle和需要更新版本的软件与旧版本冲突。这就是为什么iTextG(iText的Android端口)使用SpongyCastle而不是BouncyCastle。SpongyCastle与BouncyCastle相同,只是包名不同。这样SpongyCastle就不会与Android上可用的BouncyCastle版本冲突


长话短说:你说我有下面提到的依赖项,但你的假设是正确的,我认为是错误的,因为你混合了iText的两个不同版本。

为什么你依赖于
com.itextpdf:itextpdf
com.lowagie:iText
?回答你的问题:BouncyCastle是iText的
pom.xml
中定义了可传递的依赖项,因此,如果您的应用程序不直接使用BouncyCastle,您不需要在自己的
pom.xml
中定义它。我甚至不知道九年前的
com.lowagie:iText
版本需要什么版本的BouncyCastle作为依赖项。运行这个命令:
mvn依赖项:tree-Dverbose | tee dependens.txt
(在Linux/OSX上)或者
mvn dependency:tree-Dverbose>依赖于Windows上的.txt
,并将输出添加到您的问题中。为什么您依赖于
com.itextpdf:itextpdf
com.lowagie:itext
?回答您的问题:BouncyCastle是在itext的
pom.xml
中定义的可传递依赖项,因此如果您的应用程序不直接使用BouncyCastle,您不需要在自己的
pom.xml
中定义它。我甚至不知道BouncyCastle的哪个版本是
com的九年版本