Itext 运行时未找到Bouncy Castle类异常
正在尝试使用iText 5.5.9添加bouncy castle provider以对我的pdf进行数字签名。在他们的站点中添加了名为(bcprov-ext-jdk15on-154.jar)的bouncy castle提供程序java5-8。以下是基于Bruno关于使用iText的数字签名白皮书的测试代码Itext 运行时未找到Bouncy Castle类异常,itext,bouncycastle,Itext,Bouncycastle,正在尝试使用iText 5.5.9添加bouncy castle provider以对我的pdf进行数字签名。在他们的站点中添加了名为(bcprov-ext-jdk15on-154.jar)的bouncy castle提供程序java5-8。以下是基于Bruno关于使用iText的数字签名白皮书的测试代码 static String keyStore = "F:\\keystores\\ks.jks"; static String src = "C:\\documenttobesign
static String keyStore = "F:\\keystores\\ks.jks";
static String src = "C:\\documenttobesigned.pdf";
static String dest = "C:\\signedDocument.pdf";
public static void main(String[] args)
{
try
{
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
char[] password = "password111".toCharArray();
BouncyCastleProvider bouncyCastleCryptoProvider = new BouncyCastleProvider();
Security.addProvider(bouncyCastleCryptoProvider);
File file = new File(keyStore);
InputStream is = new FileInputStream(file);
ks.load(is, password);
String alias = (String) ks.aliases().nextElement();
PrivateKey pk = (PrivateKey) ks.getKey(alias, password);
Certificate[] chain = ks.getCertificateChain(alias);
SignHelloWorld app = new KeyStoreTest.SignHelloWorld();
app.sign(src, String.format(dest, 2), chain, pk, DigestAlgorithms.SHA256, bouncyCastleCryptoProvider.getName(), CryptoStandard.CMS, "Reason", "Chennai");
}
catch (KeyStoreException e)
{
e.printStackTrace();
}
catch (FileNotFoundException fnf)
{
fnf.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
}
static class SignHelloWorld
{
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);
}
}
这是堆栈跟踪
Exception in thread "main" java.lang.NoClassDefFoundError: org/spongycastle/jcajce/provider/digest/MD2$Digest
at test.KeyStoreTest$SignHelloWorld.sign(KeyStoreTest.java:84)
at test.KeyStoreTest.main(KeyStoreTest.java:53)
Caused by: java.lang.ClassNotFoundException: org.spongycastle.jcajce.provider.digest.MD2$Digest
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 2 more
您正在使用iTextG而不是iText。有没有具体的原因?你是为Android开发的吗?你的问题没有提到Android。是的,这就是问题所在。我使用的是iText android版本,它使用的是spongyCastle而不是bouncyCastle。在这种情况下,您对spongyCastle有依赖性。你应该得到SpongyCastle jar并修改你的代码,使它引用SpongyCastle而不是BouncyCastle。有没有具体的原因?你是为Android开发的吗?你的问题没有提到Android。是的,这就是问题所在。我使用的是iText android版本,它使用的是spongyCastle而不是bouncyCastle。在这种情况下,您对spongyCastle有依赖性。您应该获得SpongyCastle jar并修改代码,使其引用SpongyCastle而不是BouncyCastle。