在现有PDF签名上添加签名时间戳

时间:2014-09-05 14:38:39

标签: pdf timestamp itext digital-signature

我有一个已签名的PDF,我想在此签名上添加时间戳,并可选择添加撤销信息(CRL / OCSP)。

有没有人知道如何在Java中做到这一点(最好使用iTextpdf库)?

提前谢谢!

迈克尔

1 个答案:

答案 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;。