我有一个已签名的PDF,我想在此签名上添加时间戳,并可选择添加撤销信息(CRL / OCSP)。
有没有人知道如何在Java中做到这一点(最好使用iTextpdf库)?
提前谢谢!
迈克尔
答案 0 :(得分:1)
我假设您指的是添加"文档安全存储"和"文档级时间戳" (RFC 3161),如PAdES-5标准中所定义。这在section 5.4 of my book中解释。
这是一个可以添加两者的方法示例:
public void addLtv(
String src, String dest,
OcspClient ocsp, CrlClient crl, TSAClient tsa)
throws IOException, DocumentException, GeneralSecurityException {
PdfReader r = new PdfReader(src);
FileOutputStream fos = new FileOutputStream(dest);
PdfStamper stp = PdfStamper.createSignature(r, fos, '\0', null, true);
LtvVerification v = stp.getLtvVerification();
AcroFields fields = stp.getAcroFields();
List<String> names = fields.getSignatureNames();
String sigName = names.get(names.size() - 1);
PdfPKCS7 pkcs7 = fields.verifySignature(sigName);
if (pkcs7.isTsp())
System.out.println("TIMESTAMP!");
for (String name : names) {
v.addVerification(name, ocsp, crl,
LtvVerification.CertificateOption.WHOLE_CHAIN,
LtvVerification.Level.OCSP_CRL,
LtvVerification.CertificateInclusion.NO);
}
PdfSignatureAppearance sap = stp.getSignatureAppearance();
LtvTimestamp.timestamp(sap, tsa, null);
}
请注意,此方法会写入&#34; TIMESTAMP&#34;如果添加的最后一个签名是文档级时间戳,则为System.out
。
重要提示:在回答了这个问题之后,我看到了mkl的评论:之后添加撤销信息只能使用超出当前PDF标准I SO 32000-1的机制,例如: PAdES第4部分。我的答案显然假设您正在讨论使用PAdES标准应用的签名。也许在我的第一句话中并没有清楚#34;我假设&#34;。