首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >认证签名的LTV

认证签名的LTV
EN

Stack Overflow用户
提问于 2016-08-09 16:47:34
回答 1查看 1.2K关注 0票数 1

在过去的几周里,我一直在与iText合作对PDF文件进行数字签名,并且基于我所理解的,有两种方法可以将这些信息添加到PDF中,使其启用LTV:

  • 使用iText示例中提供的代码添加信息,此方法要求签名已经存在,因为它创建的DSS和VRI字典引用签名。
  • 在签名时将crl字节& ocsp响应嵌入到签名中。

尽管第一种方法产生了一个漂亮整洁的pdf文件,但问题是它修改pdf文件以创建/追加条目,从而导致认证签名无效,但第二种方法工作良好,但它在很大程度上增加了pdf大小,这取决于crl列表的大小(这也可能会增加加班时间)。

结束时,除了将信息嵌入签名本身之外,还有其他方法可以使认证签名LTV启用吗?有没有办法在签名时创建dds/vri字典?

编辑:以下是关于评论的更多信息:

用于添加ltv信息的代码:

代码语言:javascript
复制
    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 15.017.20053作为我的PDF查看器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-12 07:29:27

对示例文件的观察

我用OP的样本PDF做了一些测试。事实上,Acrobat (Reader)不喜欢由iText生成的不需要任何更改的PAdES-4 LTV添加--允许的认证,而且在这方面有一点大脑分裂,并称两者都有。

自应用此签名以来,对此文档所做的一些更改是文档作者不允许的。

自适用此签字以来,本文件未作任何改动。

( Acrobat签名属性对话框按下计算修改列表__)

即使当我删除任何超出添加的LTV信息的更改( (BaseVersion还调整了文档修改日期元数据),我最终还是删除了添加的Extensions entry ESIC 1.7,ExtensionLevel 5),该条目向PDF查看器指示可能存在PADS-4 LTV内容,只有DSS引用和内容仍然存在。

因此,Acrobat违反了

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

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

尽管Leonard (当时是Adobe的传道者)在iText邮件列表上得到了保证

我向我的工程师进行了检查,他们确实证实了DocMDP/Cert签名完全支持LTV。

(http://itext.2136553.n4.nabble.com/Verify-certified-with-transform-method-DocMDP-signatures-tt4300147.html#a4303431日期:2012年1月17日;下午3时15分)

不过,我没有检查两个选项,也许Acrobat只遵守上面的PAdES-4要求,如果证书签名是PADS-3签名,或者刚刚认证的版本中已经经过认证的文档至少包含一个(BaseVersion扩展条目ESIC 1.7,ExtensionLevel 5)。

手边的文档包含一个传统的ISO 32000-1签名(可以被认为是PADS-2签名,但也可以被认为是PAdES不知情的签名),并且没有ESIC扩展条目指示PDF-1.3。

在最后将其称为Acrobat之前,我会尝试使用PADS-3签名和ESIC扩展条目(或者根据PADS-4节的ADBE条目)进行更改。

问题本身

结束时,除了将信息嵌入签名本身之外,还有其他方法可以使认证签名LTV启用吗?有没有办法在签名时创建dds/vri字典?

帕德斯-4的补充被描述为指先前修订的文件中的签名,而不是同一修订本中添加的签名。因此,虽然在技术上可以在同一修订版中添加信息,但不能保证符合标准的PDF查看器将使用这些信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38856382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档