认证签名的LTV

时间:2016-08-09 16:47:35

标签: java pdf itext

过去几周我一直在使用iText对PDF文件进行数字签名,并根据我的理解,有两种方法可以将信息添加到PDF中以使其启用LTV:

  • 使用iText示例中提供的代码添加信息,此方法需要签名已经存在,因为DSS&它创建的VRI词典引用了签名。

  • 嵌入crl字节&签名时签名中的ocsp响应。

尽管第一种方法导致了一个漂亮而整洁的pdf文件,但问题在于它修改了pdf文件以创建/附加导致证明签名失效的条目, 第二个工作正常,但它会大大增加pdf大小,具体取决于crl列表的大小(这也可能会增加加班时间)。

总结一下,除了在签名本身中嵌入信息之外,还有其他方法可以启用认证签名LTV吗?有没有办法在签约时创建dds / vri词典?

编辑:以下是评论中要求的更多信息:

用于添加ltv信息的代码:

    public static void processDocumentLtv(String filePath) throws IOException, GeneralSecurityException, DocumentException {

    long startTime = System.currentTimeMillis();

    File original = new File(filePath);
    File temp = new File(filePath + ".ltv");

    PdfReader reader = new PdfReader(filePath);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(temp), '\0', true);

    LtvVerification ltvVerification = stamper.getLtvVerification();
    OcspClient ocspClient = new OcspClientBouncyCastle();
    AcroFields fields = stamper.getAcroFields();
    List<String> signatureNames = fields.getSignatureNames();
    String sigName = signatureNames.get(signatureNames.size() - 1);
    PdfPKCS7 pkcs7 = fields.verifySignature(sigName);
    Certificate[] chain = pkcs7.getSignCertificateChain();
    X509Certificate x509certificate = pkcs7.getSigningCertificate();

    byte[] ocspResponse = ocspClient.getEncoded(x509certificate, CertificateUtils.getParent(x509certificate, chain), null);
    Collection<byte[]> crlBytes = CertificateUtils.fetchCrlBytes(x509certificate, chain);
    Collection<byte[]> ocspBytes = null;

    if (ocspResponse != null) {
        ocspBytes = new ArrayList<>();
        ocspBytes.add(ocspResponse);
    }

    ltvVerification.addVerification(sigName, ocspBytes, crlBytes, null);

    ltvVerification.merge();

    stamper.close();
    reader.close();

    Files.copy(temp.toPath(), original.toPath(), StandardCopyOption.REPLACE_EXISTING);
    temp.delete();

    logger.info("Took {}ms to do add the ltv information to the document.", (System.currentTimeMillis() - startTime));
}

文件样本: 在尝试添加LTV数据之前:https://www.dropbox.com/s/79ll23ndt9mbh3g/pdf-sample-pre-ltv.pdf?dl=0

完成上述代码后:https://www.dropbox.com/s/hjl73es6hrqspi3/pdf-sample-post-ltv.pdf?dl=0

我正在使用Adobe Reader DC v15.017.20053作为我的PDF查看器。

1 个答案:

答案 0 :(得分:0)

使用示例文件进行观察

我使用OP的样本PDF进行了一些测试。实际上,Adobe Acrobat(Reader)不喜欢iText生成的PAdES-4 LTV添加到PDF中,并且没有允许更改的认证,并且它有点大脑分裂,并说两者都

  

文档作者不允许在应用此签名后对本文档所做的一些更改。

  

自应用此签名以来,此文档未进行任何更改。

Signature Properties dialog

(按计算修改列表后的Adobe Acrobat签名属性对话框)

即使我删除了超过添加LTV信息的任何更改(iText另外调整了文档修改日期元数据),这种情况仍然存在,我最终甚至删除了添加的扩展条目 ESIC BaseVersion 1.7, ExtensionLevel 5)向PDF查看器显示可能存在PAdES-4 LTV内容,仅 DSS < / strong>参考和内容仍然存在。

因此,Adobe Acrobat违反了需要

的PAdES-4规范
  

DocMDP限制(参见ISO 32000-1 1条款12.8.2.2)不适用于包含DSS字典和相关VRI,Certs,CRL和OCSP的PDF文档的增量更新。

(ETSI TS 102 778-4 V1.1.2(2009-12)附件A.1文件安全商店)

即使Leonard Rosenthol(当时的Adobe PDF传播者)在iText邮件列表上保证

  

我与我的工程师核实过他们确实证实了DocMDP / Cert签名完全支持LTV。

Reply to "Verify certified (with transform method DocMDP) signatures"日期为2012年1月17日;下午3:15)

我没有检查两个选项,但是,如果证书签名是PAdES-3签名,或者如果已经在认证版本中的认证文档至少包含一个PAdES-4,则Adobe Acrobat可能只遵守上述PAdES-4要求扩展程序条目 ESIC BaseVersion 1.7, ExtensionLevel 5)。

手头的文件包含传统的ISO 32000-1签名(可以被视为PAdES-2签名但也可以被视为PAdES-unaware签名)并且表示没有 ESIC的PDF版本1.3 扩展条目。

在最终称之为Adobe Acrobat错误之前,我尝试使用PAdES-3签名和 ESIC 扩展条目(或根据 ADBE )进行更改到PAdES-4第4.4节。

问题本身

  

总结一下,除了在签名本身中嵌入信息之外,还有其他方法可以启用认证签名LTV吗?有没有办法在签约时创建dds / vri词典?

PAdES-4的添加被描述为参考文档的先前修订版中的签名,而不是指在同一修订版中添加的签名。因此,尽管在技术上可以在同一版本中添加信息,但不能保证它们将由符合标准的PDF查看器使用。