【问题标题】:Digital Signature in iText 2.1.7iText 2.1.7 中的数字签名
【发布时间】:2019-06-05 13:09:19
【问题描述】:

我需要使用 Java 在 PDF 文件中添加数字签名。任何人都可以提供将数字签名写入 PDF 的示例代码吗?

我正在使用iText 2.1.7,并且不允许将 Jar 升级到 iText 7

【问题讨论】:

  • 你说你不能更新到 iText 7。但是你可以更新到 iText 5.5.x 吗?
  • 你应该使用openPDF然后...github.com/LibrePDF/OpenPDF
  • @mkl 我们的组织正在使用 iText 2.1.7,无法替换 Jar。
  • @Lonzak 谢谢,看来它会解决我的问题。
  • 如果无法更换Jar,OpenPDF如何解决您的问题?

标签: java itext


【解决方案1】:

您可以找到用于签名here 的旧文档。还有一些 sn-p 如何完成 PKCS7 签名:

PdfStamper stamper = PdfStamper.createSignature(super.reader, this.os, '\0',null,true);
PdfSignatureAppearance sigApp = stamper.getSignatureAppearance();

if(signatureFieldName==null){
 //for new signatures
 sigApp.setVisibleSignature(new Rectangle(lowerLeftX, lowerLeftY, upperRightX, upperRightY),pageNumber, signatureFieldName);
}
else{
  //existing signatures
  sigApp.setVisibleSignature(signatureFieldName);
}
sigApp.setAcro6Layers(true);
sigApp.setLayer4Text("");
//signer name
sigApp.setLayer2Text("");
//No question mark should appear -> overwrite layer 1
PdfTemplate t = sigApp.getLayer(1);
t.setBoundingBox(new Rectangle(100, 100));
t.setLiteral("% DSBlank\n");

sigApp.setReason("I agree");
sigApp.setLocation("Your location");
sigApp.setImage(Image.getInstance(yourImageOfASignature));
sigApp.setImageScale(0f);
sigApp.setSignDate(signingTime);

PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKLITE,PdfName.ADBE_PKCS7_DETACHED); 
dic.setDate(new PdfDate(signingTime));
dic.setName(PdfPKCS7.getSubjectFields((X509Certificate)this.chain[0]).getField("CN"));

sigApp.setCryptoDictionary(dic);
int estimatedSize=8192;

HashMap<PdfName, Integer> exclusions = new HashMap<>();
exclusions.put(PdfName.CONTENTS, Integer.valueOf(estimatedSize*2+2));
sigApp.preClose(exclusions);

//hash pdfSigApp.getRangeStream() and create a PKCS#7 signature container in a byte[] signatureContent
PdfPKCS7 pk7 = new PdfPKCS7(this.privateKey, this.chain, null, "SHA-256", null, false);
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] buf = new byte[estimatedSize];
int n;
InputStream inp = sigApp.getRangeStream();
while ((n = inp.read(buf)) > 0) {
    messageDigest.update(buf, 0, n);
}
inp.close();
byte[] hash = messageDigest.digest();
byte[] sh = pk7.getAuthenticatedAttributeBytes(hash, signTime, null);
pk7.update(sh, 0, sh.length);
PdfDictionary dic2 = new PdfDictionary();
byte[] encodedSig = pk7.getEncodedPKCS7(hash, signTime);
byte[] paddedSig = new byte[estimatedSize];

//insert pkcs7 container
if(encodedSig.length>paddedSig.length){
    throw new SigningException("Internal signing error - signature size constraints must be increased.");
}
System.arraycopy(encodedSig, 0, paddedSig, 0, encodedSig.length);
dic2.put(PdfName.CONTENTS, new PdfString(paddedSig).setHexWriting(true));
sigApp.close(dic2);

【讨论】:

  • 如果你这样做setAcro6Layers(true),除了第 2 层之外,应该没有必要玩其他层。
猜你喜欢
  • 2014-03-26
  • 1970-01-01
  • 2017-03-31
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多