我正在使用ITextSharp 5.1.1对具有多个签名字段的PDF进行数字签名。我有4个签名字段:3个批准签名(用户签署文档),第4个签名是证书签名,我们的系统签名表明文档已经过验证,并且不能对PDF进行进一步修改。 / p>
如果我添加多个批准签名,则会为每个签名创建一个新修订,并且所有签名都有效。
一旦我在签名过程结束时添加证书签名,它就会使之前的所有批准签名无效。
我在这里遗漏了什么吗?是否有不同的方法可以在不使批准签名无效的情况下实现与认证签名相同的效果?
TIA
答案 0 :(得分:0)
您的方法是首先在文档中添加一些批准签名,然后再添加证书签名。
这种方法不起作用,因为它违反了PDF规范。问题是从2011年开始,我引用第1部分,即2008年发布的ISO 32000-1,而不是第2部分,即2017年发布的ISO 32000-2;实质上,这两个规范都同意这个问题。
PDF文档可能包含以下标准类型的签名:
一个或多个批准签名。 [...]
最多一个认证签名(PDF 1.5)。 [...]签名词典应包含具有 DocMDP 转换方法的签名参考词典(参见表253)。有关如何创建和验证这些签名的信息,请参见12.8.2.2,“DocMDP”。
最多两个使用权签名。 [...]
(ISO 32000-1第12.8和34条;数字签名",第12.8.1小节"一般")
DocMDP 转换方法应用于检测相对于由文档作者(应用第一个签名的人)签名的签名字段的修改。文档只能包含一个包含 DocMDP 转换方法的签名字段; 它应该是文件中的第一个签名字段。
(ISO 32000-1第12.8.2.2节" DocMDP",第12.8.2.2.1小节"一般")
因此,毫无疑问一旦您在签名过程结束时添加证书签名,它就会使所有以前的批准签名无效,因为已经将证书签名添加到已签名过程中按定义签名的文档使文档的签名结构无效。 (好的,Adobe在这种情况下的错误信息可以更清楚地指出问题......)
您是否想知道是否有不同的方式来实现与认证签名相同的效果而不会使批准签名无效?
根据 原始ISO 32000-1 ,您的选项有限。通过签名字段锁定字典(请参阅第12.7.4.5节"签名字段")和最终签名中的 FieldMDP 转换,您可以锁定现有的表单字段:
代表文档作者创建包含表单字段和签名的文档,以下内容应由合规作者支持:
作者指定填写表格字段而不使批准或证明签名无效。 DocMDP 转换参数字典的 P 条目应设置为2或3(参见表254)。
作者还可以指定在特定收件人签署文档后,对特定表单字段的任何修改都将使该收件人的签名无效。每个指定的接收者都应有一个单独的签名字段,每个字段都有一个相关的签名字段锁字典(见表233),指定应为该用户锁定的表单字段。
当收件人签署字段时,应创建签名,签名引用和转换参数字典。变换参数字典中的操作和字段条目应从签名字段锁定字典中的相应字段中复制。
(ISO 32000-1第12.8.2.4节" FieldMDP")
但是,如果您的原始认证签名允许注释更改或者没有开始的认证签名,则不能禁止此类注释更改。
另一方面,如果您的PDF处理器和查看器支持 ISO 32000-1以及带有ExtensionLevel 3的Adobe Supplement ,则中的其他条目指定了字段锁字典:
P 号码(可选; ExtensionLevel 3)为此文档授予的访问权限。有效值如下:
1,不允许对文件进行任何更改;对文档的任何更改都会使签名无效。
2,允许的更改填写表单,实例化页面模板和签名;其他更改使签名无效。
3,允许的更改与2相同,以及注释创建,删除和修改;其他更改使签名无效。
默认值:无;缺少此密钥不会对签名验证规则产生影响。
如果MDP权限已从先前的增量保存部分或文档的原始部分生效,则该数字应指定小于或等于基于文档中较早的签名已生效的权限的权限。也就是说,可以拒绝权限但不添加权限。如果该数字指定的权限大于已生效的MDP值,则忽略新数字。
如果文档没有作者签名,则有效的初始权限是基于数字3的权限。
新权限适用于此密钥所属签名后文档的任何增量更改。
(ISO补充,ISO 32000-1 ExtensionLevel 3第I部分和第34部分;扩展PDF规范",第8.6.3和34条;字段类型",小节"签名字段")
此增加已被 ISO 32000-2 采用。
如果您想从5.3.0版开始使用iText这些机制,请查看由iText的Bruno Lowagie撰写的Digital Signatures for PDF Documents白皮书。第2.5.5节"签署后锁定字段和文件"说明了如何在iText中使用这些机制。