【问题标题】:unable to digitally sign pdf using itext and java无法使用 itext 和 java 对 pdf 进行数字签名
【发布时间】:2013-04-06 03:39:33
【问题描述】:

我正在尝试在 pdf 文件上添加基本数字签名。我正在尝试使用itext网站上提供的代码。代码如下-

 public class DigiSign {
public static void main(String a[])
{
    try {

        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(new FileInputStream("C:\\WSR\\keystore.ks"), "password".toCharArray());
        String alias = (String) ks.aliases().nextElement();
        PrivateKey key = (PrivateKey) ks.getKey(alias, "password".toCharArray());
        java.security.cert.Certificate[] chain = ks.getCertificateChain(alias);
        PdfReader reader = new PdfReader("C:\\WSR\\a.pdf");
        FileOutputStream fout = new FileOutputStream("C:\\WSR\\signed.pdf");
        PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0');
        PdfSignatureAppearance sap = stp.getSignatureAppearance();
        sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
        sap.setReason("arpit");
        sap.setLocation("arpit");
        // comment next line to have an invisible signature
        sap.setVisibleSignature(new Rectangle(10, 10, 20, 20), 1, null);
        stp.close();
    } catch (Exception ex) {
        Logger.getLogger(DigiSign.class.getName()).log(Level.SEVERE, null, ex);
    }
}

}

我使用

创建了密钥

keytool -genkey -keyalg RSA -alias myname -keypass 密码 -keystore keystore.ks -dname "cn=Paulo Soares, c=PT" 并将 abc123 设置为我的密码。 现在当我运行这段代码时,我得到了这个异常

 Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/asn1/DEREncodable
    at com.lowagie.text.pdf.PdfSignatureAppearance.getAppearance(Unknown Source)
    at com.lowagie.text.pdf.PdfSignatureAppearance.preClose(Unknown Source)
    at com.lowagie.text.pdf.PdfSignatureAppearance.preClose(Unknown Source)
    at com.lowagie.text.pdf.PdfStamper.close(Unknown Source)
    at DigiSign.main(DigiSign.java:42)
   Caused by: java.lang.ClassNotFoundException: org.bouncycastle.asn1.DEREncodable
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

我做错了什么?

【问题讨论】:

  • 您似乎忘记了将 Bouncy Castle 添加到您的类路径(或那里的版本错误)。此外,你应该看看这个white paper
  • 是的,我确实忘记将充气城堡导入我的项目..添加它..并且代码现在正在运行
  • 哎呀,但您使用的是已弃用的签名类型。请阅读itextpdf.com/book/digitalsignatures 否则您的客户会在您交付代码时非常失望。
  • 您说您在 iText 网站上找到了该代码。可以分享网址吗?因为我负责 iText 网站,我在任何地方都找不到该代码。如果我找到了,我会删除它!
  • 好吧,也许你指的是itextpdf.sourceforge.net/howtosign.html 那页太旧了,我什至都不记得了。我已经重定向到最新的文档。

标签: java pdf itext


【解决方案1】:

(只是将原因表述为之前已作为评论提出的答案:)

对于安全性低级别操作,iText 基于 BouncyCastle 库。这尤其涉及集成 PDF 签名的创建和验证,以及加密文档的处理。因此,在这些用例中,应用程序的类路径中需要适当的 BouncyCastle 提供程序库。

主要异常信息

java.lang.NoClassDefFoundError: org/bouncycastle/asn1/DEREncodable

表示此要求未满足,或者 BouncyCastle 根本不存在或至少在所需版本中不存在。同时,@user1946152 的配置也证实了这一点。

P.S.:显然,在手头的情况下,OP 仍然使用 5.x 之前的 iText 版本。虽然有某些条件强制执行此操作(例如,管理层不愿意决定何时购买许可证sigh),但您应该明确更新到当前版本的 iText。与此同时,也发生了许多重大变化,尤其是在电子签名、内容解析和 PDF/A 文档创建等领域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多