【问题标题】:signature is invalid in revision 2 - caused by attachmens修订版 2 中的签名无效 - 由附件引起
【发布时间】:2023-03-23 19:27:02
【问题描述】:

我刚刚编写了将文件附加到 PDF 文档的代码。我已经在 PDFBox 页面中看到了代码。

PDEmbeddedFilesNameTreeNode efTree = new PDEmbeddedFilesNameTreeNode();

PDComplexFileSpecification fs = new PDComplexFileSpecification();
fs.setFile( "Test.txt" );
InputStream is = ...;
PDEmbeddedFile ef = new PDEmbeddedFile(doc, is );
ef.setSubtype( "test/plain" );
ef.setSize( data.length );
ef.setCreationDate( new GregorianCalendar() );
fs.setEmbeddedFile( ef );
Map efMap = new HashMap();
efMap.put( "My first attachment", fs );
efTree.setNames( efMap );
PDDocumentNameDictionary names = new PDDocumentNameDictionary( doc.getDocumentCatalog() );
names.setEmbeddedFiles( efTree );
doc.getDocumentCatalog().setNames( names );
doc.save("attachedPDF"); 

那,有效。

然后,我附加文件,并签署文件。 结果是 - 一切正常!

然后,我得到 已签名 文档(其中包含 附件),然后使用另一个附件 签署文档(我创建了修订版 2 . 换句话说,我将另一个文件附加到已签名的文档并再次签名)。结果,没有旧文件。新文件覆盖了旧文件(签名也变得无效,因为更改了哈希 - 这是正确的);

所以,我已经完成了从 PDEmbeddedFilesNameTreeNode 获取 oldFiles 并添加到新文件映射的操作。

PDEmbeddedFilesNameTreeNode oldFiles=names.getEmbeddedFiles();
        if(oldFiles!=null){
            Map oldFilesMap = oldFiles.getNames();
            Iterator iterator = oldFilesMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry mapEntry = (Map.Entry) iterator.next();
                System.out.println("The key is: " + mapEntry.getKey()+ ",value is :" + mapEntry.getValue());
                efMap.put(mapEntry.getKey(),  mapEntry.getValue());
            }

        }
efTree.setNames(efMap);

这行得通。但是当我创建第二个修订版时签名再次无效。 我认为,主要问题是,当我将新文件添加到同一个文件 NameDictionary 时,文档的哈希值会发生变化。

所以,我想,我应该在下一个版本中创建新的NameDictionary,可能是我错了(我不能使用已有的NameDictionary)。我不明白。我能知道什么?你觉得呢?

顺便说一句,我认为这对我来说是不正确的,下一次修订

PDDocumentNameDictionary names = new PDDocumentNameDictionary(doc.getDocumentCatalog());

那是my sample documents

【问题讨论】:

    标签: pdf adobe digital-signature acrobat pdfbox


    【解决方案1】:

    然后,我得到 已签名 文档(其中有 附件),然后使用另一个附件 签署文档(我创建了修订版 2 . 换句话说,我将另一个文件附加到已签名的文档并再次签名。

    无论你有什么其他问题尝试这个,这项事业本身已经注定。即使您将其作为增量更新进行,也不允许对已签名文档执行此操作。

    对先前签署的文件允许的操作要么受到规范的限制(在认证签名的情况下),要么受到认证规则的推断(仅在批准签名的情况下)的限制。

    如果是认证签名(DocMDP 签名),DocMDP 转换参数字典中的 P 值选择允许的操作集文件:

    (可选) 授予此文档的访问权限。有效值应为:

    1 不允许更改文件;对文件的任何更改都将使签名无效。

    2 允许的更改应为填写表格、实例化页面模板和签名;其他更改将使签名无效。

    3 允许的更改应与 2 相同,以及注释的创建、删除和修改;其他更改将使签名无效。

    默认值:2。

    ISO 32000-1 中的第 12.8.2.2.2 节)

    如您所见,附加文件不在其中。

    很遗憾,规范没有明确说明如果没有证书签名(DocMDP 签名),哪些更改是允许的;因此,人们可能会认为一切都是允许的。

    但实际上,当前的 PDF 查看器,尤其是占主导地位的 Adob​​e Reader,假设不同,并推断出一组允许的更改。在 Adob​​e Reader 的情况下(参见this answer 了解详细信息)与 DocMDP 相同,带有 P = 3 并添加签名字段。 (假设作者没有真正考虑签名用例,因此很可能忘记添加空签名字段;否则,虽然,允许的更改集被认为是适当的。)

    因此,也没有附加文件。

    如果您想处理多个附件和多个签名,您可以考虑通过创建新 PDF、添加原始 PDF 和新文件作为附件(并设置 enw PDF 以显示原始 PDF)来补充已签名的 PDF默认情况下),然后对整个构造进行签名。

    PS:关于您的实际尝试:当您尝试操作已签名的文档DOC-signed.pdf 时,您似乎是从使用PDFBox 读写它开始的;我假设这是因为DOC-signed.pdf 不是 DOC-signed-signed.pdf 的起始部分,但后一个文档确实包含新附件和增量更新中的第二个签名。

    这导致原始文件在内部重组,原始签名在此过程中被破坏。您应该从创建文件的相同副本开始,然后将第二个签名添加为增量更新。

    【讨论】:

    • 据我了解,您的意思是:首先,我必须将附件添加到已签名的文档中作为增量更新(这将创建新的 PDF 文档)。然后将第二个签名也作为增量更新添加到文档中。对吗?
    • 不,不完全是。首先,向已签名的 PDF 添加附件不起作用,它总是会破坏第一个签名,因为在签名后添加附件绝不是允许的更改。但即使是这样,您也做错了其他事情,因为您不必要地更改了原始签名文件。
    • 最后,您的回答是:如果我签署了带有附件的文件。 没有办法将第二个修订版 2 添加到此文档另一个附件。 (有 2 个签名的文件,每个修订都是附件)。我对么? :-)
    • 对,只要您希望原始签名保持有效即可。
    • 虽然我们正在研究它,但在 PAdES-Part 5 中有一个参考,即 DocMDP 可用于稍后修改嵌入式 XML,尽管 DocMDP 理论上不允许更改嵌入式文件。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多