Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用itext:Exception in thread“对pdf进行签名时出错;“主要”;java.lang.NoClassDefFoundError:org/bouncycastle/cert/X509CertificateHolder_Java_Pdf_Itext - Fatal编程技术网

尝试使用itext:Exception in thread“对pdf进行签名时出错;“主要”;java.lang.NoClassDefFoundError:org/bouncycastle/cert/X509CertificateHolder

尝试使用itext:Exception in thread“对pdf进行签名时出错;“主要”;java.lang.NoClassDefFoundError:org/bouncycastle/cert/X509CertificateHolder,java,pdf,itext,Java,Pdf,Itext,在使用Bruno Lowagie白皮书中的代码示例2.2对pdf进行签名时,我遇到了以下错误:pdf文档的数字签名 Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/cert/X509CertificateHolder at com.itextpdf.text.pdf.security.MakeSignature.signDetached(MakeSignature.java:143) at c

在使用Bruno Lowagie白皮书中的代码示例2.2对pdf进行签名时,我遇到了以下错误:pdf文档的数字签名

Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/cert/X509CertificateHolder
at com.itextpdf.text.pdf.security.MakeSignature.signDetached(MakeSignature.java:143)
at com.howtodoinjava.demo.poi.PDFSign.sign(PDFSign.java:77)
at com.howtodoinjava.demo.poi.PDFSign.main(PDFSign.java:51)
原因:java.lang.ClassNotFoundException:org.bouncycastle.cert.X509CertificateHolder

第77行包含这行代码:MakeSignature.SignDistached(外观、摘要、签名、链、null、null、null、0、子过滤器)

第51行包含这一行:

app.sign(SRC, String.format(DEST, 1), chain, pk, DigestAlgorithms.SHA256,
provider.getName(), CryptoStandard.CMS, "Test 1", "Harare");
代码

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSignatureAppearance;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.security.DigestAlgorithms;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import com.itextpdf.text.pdf.security.BouncyCastleDigest;
import com.itextpdf.text.pdf.security.ExternalDigest;
import com.itextpdf.text.pdf.security.ExternalSignature;
import com.itextpdf.text.pdf.security.MakeSignature.CryptoStandard;
import com.itextpdf.text.pdf.security.PrivateKeySignature;
import com.itextpdf.text.pdf.security.MakeSignature;


/**
 *
 * @author hdear
 */
public class PDFSign {
public static final String KEYSTORE = "C:\\Program Files\\Java\\jdk1.8.0_05\\bin\\ks";
public static final char[] PASSWORD = "hubert".toCharArray();
public static final String SRC = "Hello World.pdf";
public static final String DEST = "Hello World_signed%s.pdf";
public static void main(String[] args)
throws GeneralSecurityException, IOException, DocumentException {
BouncyCastleProvider provider = new BouncyCastleProvider();
Security.addProvider(provider);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(new FileInputStream(KEYSTORE), PASSWORD);
String alias = (String)ks.aliases().nextElement();
PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD);
Certificate[] chain = ks.getCertificateChain(alias);
PDFSign app = new PDFSign();
app.sign(SRC, String.format(DEST, 1), chain, pk, DigestAlgorithms.SHA256,
provider.getName(), CryptoStandard.CMS, "Test 1", "Harare");
app.sign(SRC, String.format(DEST, 2), chain, pk, DigestAlgorithms.SHA512,
provider.getName(), CryptoStandard.CMS, "Test 2", "Harare");
app.sign(SRC, String.format(DEST, 3), chain, pk, DigestAlgorithms.SHA256,
provider.getName(), CryptoStandard.CADES, "Test 3", "Harare");
app.sign(SRC, String.format(DEST, 4), chain, pk, DigestAlgorithms.RIPEMD160,
provider.getName(), CryptoStandard.CADES, "Test 4", "Harare");
}
public void sign(String src, String dest,
Certificate[] chain, PrivateKey pk, String digestAlgorithm, String provider,
CryptoStandard subfilter, String reason, String location)
throws GeneralSecurityException, IOException, DocumentException {
// Creating the reader and the stamper
PdfReader reader = new PdfReader(src);
FileOutputStream os = new FileOutputStream(dest);
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
// Creating the appearance
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setReason(reason);
appearance.setLocation(location);
appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig");
// Creating the signature
ExternalDigest digest = new BouncyCastleDigest();
ExternalSignature signature =
new PrivateKeySignature(pk, digestAlgorithm, provider);
MakeSignature.signDetached(appearance, digest, signature, chain,null, null, null, 0, subfilter);
}
}

有人需要帮助吗?

当您收到
NoClassDefFoundError
时,您的类路径有问题

  • 或者您没有将必要的BouncyCastle jar包含到类路径中。在这种情况下,应用程序找不到
    org/bouncycastle/cert/X509CertificateHolder
    类是正常的:它不在那里补救措施:将适当的BouncyCastle jar添加到类路径中
  • 或者在类路径中有多个版本的BouncyCastle。在这种情况下,您的应用程序不知道应该选择多个
    X509CertificateHolder
    类中的哪一个补救措施:从类路径中删除所有版本的BouncyCastle,所需版本除外
  • 或者您的类路径中有错误版本的BouncyCastle。可能是缺少
    X509CertificateHolder
    的版本,或者它存在于另一个包中补救措施:用所需的BouncyCastle版本替换该罐子

您如何知道需要哪个版本的BouncyCastle?下载iText时,您下载了特定版本的iText。此版本附带POM文件。在这个POM文件中,您可以找到iText版本号和所有依赖项。您将在该文件中找到所需的BouncyCastle版本号。

我也有同样的例外。我只有一个bouncycastle依赖项:bcprov-jdk15on,当我查看罐子内部时,没有X509CertificateHolder。我添加了另一个依赖项:bcpkix-jdk15on(根据找到的解决方案),它可以工作:)

我的工作maven依赖项:

    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.8</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.49</version>
        <type>jar</type>
        <scope>compile</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpkix-jdk15on</artifactId>
        <version>1.49</version>
        <type>jar</type>
        <scope>compile</scope>
        <optional>true</optional>
    </dependency>

com.itextpdf
itextpdf
5.5.8
org.bouncycastle
bcprov-jdk15on
1.49
罐子
编译
真的
org.bouncycastle
bcpkix-jdk15on
1.49
罐子
编译
真的

Hie Bruno的副本,感谢您的见解。我的类路径中有Bounty Castle,所有其他对库的调用都非常有效,这意味着这里的问题可能是我使用的是itext和Bouncy Castle版本,正如您在上面的第三个建议中所暗示的,它们彼此不兼容。在我移除了我拥有的赏金城堡,并将其替换为我从上面你给我的路径下载的城堡之后,我仍然会遇到同样的错误。我正在使用itext 5.5.0。知道哪个赏金城堡版本与我使用的itext版本兼容吗?你使用哪个itext版本?您使用哪个BC版本?BC有在一个次要版本和下一个版本之间进行重大更改的历史…iText版本5.5.0。我曾在《赏金城堡1.3-1.5》中尝试过这个例子,但我也遇到了同样的错误。你知道有哪个版本的《赏金城堡》和《iText》彼此完全兼容吗?我可以尝试使用这些工具。iText 5.5.0依赖于BouncyCastle 1.49。你试过那个吗?@MichaëlDemey,是的,我试过用BC 1.49提供商的itext 5.5.0。您是否有任何BC itext版本对,您在签名之前使用过,并且运行良好?也许如果我尝试一个已经在某人身上很好的PAR,我也许能够缩小bug的根本原因。