我正在学习如何从这个addLtv 链接
我的工作流程是给两个签字人的:
签署人1:
签字人2:
在此工作流中,签名者2的证书将无效,知道如何对此工作流进行addLtv吗?
如果我将最后一个签名者更改为NO_CERTIFIED,这样他的证书就不会无效,并且我添加了另一个签名者(就像时间戳一样)使其成为NO_CHANGES_ALLOWED,这是一种常见的做法吗?或者有什么更好的方法来完成这个工作流呢?

发布于 2020-05-29 15:41:18
代码中有两个问题正确地导致Adobe报告问题。不过,我还不确定在修复它们之后Adobe是否会感到高兴。
工作流程中的问题是:
认证签字作为第二签名
首先,您的代码将一个普通的批准签名(PdfSigner.NOT_CERTIFIED由signer.SetCertificationLevel设置)作为第一个签名,然后将一个认证签名(由signer.SetCertificationLevel设置的PdfSigner.CERTIFIED_NO_CHANGES_ALLOWED)作为第二个签名。
这是不允许的。根据规范ISO 32000-1:
PDF文档可能包含..。 最多一个认证签名(PDF1.5)。..。签名字典应包含具有DocMDP转换方法的签名参考字典(见表253)。..。 文档只能包含一个包含DocMDP转换方法的签名字段;它应该是文档中的第一个签名字段。
( ISO 32000-1第12.8.1及12.8.2.2.1节)
根据ISO 32000-2标准:
PDF文档可能包含下列标准类型的签名: 一个或多个批准签名(也称为收件人签名)。如果有人在场,则应在认证签字之后签字。
( ISO 32000-2第12.8.1节)
无论哪种方式,批准签名都必须遵循证书签名,而不是在证书签名之前。
(规范版本之间的更改很可能是为了允许文档时间戳在验证签名之前进行。)
因此,已经在第二个签名被应用之后,Adobe应该已经抱怨了!
不过,有一种方法可以在以后的批准签名中更改证书级别:如果您的PDF验证器支持使用Adobe增压件(带有ExtensionLevel 3或ISO 32000-2 )的ISO32000-1,则可以使用FieldMDP转换。
有关此选项的一些信息,请阅读这个答案。
PAdES ESIC扩展仅在第一次签名后声明
应用您的第一个签名时,不需要文档声明任何PDF扩展都适用。因此,PDF验证程序可能假定,对于签名验证,适用基本的ISO32000-1规则,特别是“不允许更改”的认证级别实际上意味着不允许更改。只有在声明了适当的扩展并且PDF验证器支持它时,这个规则才会有所不同。特别是
应该表明,正如ISO 32000-2同时指出的,
对PDF的更改是增量更新,只包括向文档中添加DSS和/或文档时间戳所需的数据,不应视为对文档的更改
LTV在PDF中添加iText代码,然后声明一个ESIC扩展级别5。我不知道这是从哪里来的,是否有另一个TS或者提到了那个级别,或者ESIC和ADBE级别是否混在了一起。
因此,使用您的第一个签名,您应该声明上面提到的扩展之一。
如果document是您应用第一个签名之前或期间的PdfDocument实例(您可能必须使用signer.GetDocument()从您的PdfSigner signer检索它),您可以声明如下所示的扩展:
PdfDeveloperExtension extension = new iText.Kernel.Pdf.PdfDeveloperExtension
(PdfName.ESIC, PdfName.Pdf_Version_1_7, 1);
document.GetCatalog().AddDeveloperExtension(extension);或者,您应该在签名时将您的PDF版本设置为2.0。不过,这可能会引发其他问题。
https://stackoverflow.com/questions/62061955
复制相似问题