Java 使用itext将签名者数字签名添加到pdf
正在尝试使用以下代码将数字签名(.JKS文件)添加到pdf。问题是,当使用自签名数字证书运行代码时,它工作正常,但当我们使用签名者数字证书(verisign)运行代码时,它会给出NullPointerExceptionJava 使用itext将签名者数字签名添加到pdf,java,itext,digital-signature,Java,Itext,Digital Signature,正在尝试使用以下代码将数字签名(.JKS文件)添加到pdf。问题是,当使用自签名数字证书运行代码时,它工作正常,但当我们使用签名者数字证书(verisign)运行代码时,它会给出NullPointerException KeyStore ks = null; PrivateKey key = null; Certificate[] chain = null; PdfStamper stp = null; PdfReader pdfreader = null
KeyStore ks = null;
PrivateKey key = null;
Certificate[] chain = null;
PdfStamper stp = null;
PdfReader pdfreader = null;
PdfSignatureAppearance sap = null;
int numberPages = 0;
ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(new FileInputStream(jksFile), jksPassword.toCharArray());
String alias = (String) ks.aliases().nextElement();
key = (PrivateKey) ks.getKey(alias, jksPassword.toCharArray());
chain = ks.getCertificateChain(alias);
pdfreader = new PdfReader(baos.toByteArray());
numberPages = pdfreader.getNumberOfPages();
stp = PdfStamper.createSignature(pdfreader, baosWithSign, '\0');
stp.setEncryption(null, null, PdfWriter.AllowPrinting, PdfWriter.STRENGTH128BITS);
sap = stp.getSignatureAppearance();
sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
sap.setVisibleSignature(new Rectangle(532, 50, 532 + 30, 50 + 30), numberPages, null);
stp.close();
baos.close();
例外情况:
Exception in thread "main" java.lang.NullPointerException
at com.lowagie.text.pdf.PdfSignatureAppearance.getAppearance(PdfSignatureAppearance.java:395)
at com.lowagie.text.pdf.PdfSignatureAppearance.preClose(PdfSignatureAppearance.java:902)
at com.lowagie.text.pdf.PdfSignatureAppearance.preClose(PdfSignatureAppearance.java:847)
at com.lowagie.text.pdf.PdfStamper.close(PdfStamper.java:175)
at testjks.ConvertPDFtoByteArray.convertPDFToDigitalSigatureAndPassword(ConvertPDFtoByteArray.java:99)
at testjks.ConvertPDFtoByteArray.main(ConvertPDFtoByteArray.java:115)
甚至我也试过用下面的方法,但同样的错误
sap.setCrypto(key, chain, null, PdfSignatureAppearance.VERISIGN_SIGNED);
任何人都可以帮助我,为什么我得到PrivateKey对象和Certificate[]对象为null,其中为自签名数字证书提供输出。签名者数字证书是否需要额外的代码。当我在您的错误消息中看到我的名字(我是Lowagie)时,我知道您使用的是非常旧的iText版本。您正在创建的签名不再被接受,因为您使用的签名技术已被弃用。我敢肯定,您的客户需要最先进的(符合PAdES的)签名,这意味着您必须升级到更新版本的iText。您关心的是,当前使用的版本是2009年的,数字签名技术自2009年以来有了很大的发展。感谢Lowagie的回复,使用jks文件如何使用最新版本制作签名(验证)pdf签名在页面的最后一页可见(sap.setVisibleSignature(新矩形(532,50,532+30,50+30),numberPages,null)你读了那封信了吗?只需注册、下载并阅读即可。您将学习如何使用CA中的密钥。如果您使用Verisign中的文件进行签名,我会非常惊讶。我希望他们能让您使用令牌或HSM。@BrunoLowagie当然是对的:如果出于某种原因必须使用iText 2.1.7(或某些4.2变体),请务必以符合当前接受的签名方案和策略的方式从外部创建签名容器,然后将外部创建的签名容器注入PDF。在这样做之前,请充分了解与电子签名相关的立法和标准、密码学和PDF,以了解您正在做什么。