最后一个签名者签名后如何添加Ltv?
How to addLtv after the last signer signed?
我正在学习如何从这个 link
添加 Ltv
我的工作流程适用于 2 个签名者:
签名者 1:
- 准备空签名(具有NO_CERTIFIED认证级别)
- 生成哈希并获取 p7s
- 为签名者 1 将 p7s 注入 pdf
- addLtv for signer 1 ---> 我不确定这一步
签名者 2:
- 从签名者 1(具有 NO_CHANGES_ALLOWED 认证级别)签名的 pdf 中准备空签名
- 生成哈希并为签名者 2 获取 p7s
- 为签名者 2 将 p7s 注入 pdf
- addLtv for signer 2 ---> 我不确定这一步
在此工作流程中,签名者 2 的证书将无效,知道如何为此工作流程添加 Ltv 吗?
如果我将最后一个签名者更改为 NO_CERTIFIED 这样他的证书就不会失效并且我添加另一个签名者(比如时间戳)使其成为 NO_CHANGES_ALLOWED 是否是常见的做法?或者有没有更好的方法来完成这个工作流程?
您的代码中有两个问题导致 Adobe Reader 报告问题。不过,我不确定在修复它们后 Adobe Reader 是否会高兴。
您工作流程中的问题是:
- 认证签名作为第二签名
- PAdES ESIC 扩展仅在首次签名后声明
认证签名作为第二个签名
首先,您的代码应用普通批准签名(PdfSigner.NOT_CERTIFIED
由 signer.SetCertificationLevel
设置)作为第一个签名,然后是认证签名(PdfSigner.CERTIFIED_NO_CHANGES_ALLOWED
由 [=12= 设置]) 作为第二个。
这是不允许的。 根据 PDF 规范 ISO 32000-1:
A PDF document may contain [...]
At most one certification signature (PDF 1.5). [...] The signature dictionary shall contain a signature reference dictionary (see Table 253) that has a DocMDP transform method. [...]
A document can contain only one signature field that contains a DocMDP transform method; it shall be the first signed field in the document.
(ISO 32000-1 第 12.8.1 和 12.8.2.2.1 节)
并且根据 ISO 32000-2:
A PDF document may contain the following standard types of signatures: [...]
One or more approval signatures (also known as recipient signatures). These shall follow the certification signature if one is present.
(ISO 32000-2 第 12.8.1 节)
无论哪种方式,批准签名都必须跟在认证签名之后,而不是在它之前。
(规范版本之间的更改很可能是为了允许文档时间戳位于认证签名之前。)
因此,在应用第二个签名后,Adobe Reader 应该立即投诉!
不过,有一种方法可以在以后的批准签名中更改认证级别:如果您的 PDF 验证器支持带有 Adobe Supplement 的 ISO 32000-1对于 ExtensionLevel 3 或 ISO 32000-2,FieldMDP 转换可用于此效果。
有关此选项的一些信息,请阅读 this answer。
PAdES ESIC 扩展仅在首次签名后声明
应用了您的第一个签名,但文档未声明应用任何 PDF 扩展名。因此,PDF 验证器可能假设对于签名验证,基本 ISO 32000-1 规则适用,特别是“不允许更改”的认证级别确实意味着 no 更改是允许的。仅当声明了适当的扩展名并且 PDF 验证器支持它时,此规则才可能有所不同。特别是
- ESIC 扩展级别 1(根据 ETSI TS 102 778-4 和 EN 319 142-1)或
- ADBE 扩展级别 5(根据 ETSI TS 102 778-4)或
- ADBE 扩展级别 8(根据 ETSI EN 319 142-1)
应该表明,正如 ISO 32000-2 同时指出的那样,
Changes to a PDF that are incremental updates which include only the data necessary to add DSS’s and/or document timestamps to the document shall not be considered as changes to the document
LTV 在您的 PDF 中添加 iText 代码然后声明 ESIC 扩展级别 5。我不确定这是从哪里来的,是否有另一个 TS 或 EN 提到了那个级别,或者 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。不过,这可能会导致其他问题。
我正在学习如何从这个 link
添加 Ltv我的工作流程适用于 2 个签名者:
签名者 1:
- 准备空签名(具有NO_CERTIFIED认证级别)
- 生成哈希并获取 p7s
- 为签名者 1 将 p7s 注入 pdf
- addLtv for signer 1 ---> 我不确定这一步
签名者 2:
- 从签名者 1(具有 NO_CHANGES_ALLOWED 认证级别)签名的 pdf 中准备空签名
- 生成哈希并为签名者 2 获取 p7s
- 为签名者 2 将 p7s 注入 pdf
- addLtv for signer 2 ---> 我不确定这一步
在此工作流程中,签名者 2 的证书将无效,知道如何为此工作流程添加 Ltv 吗?
如果我将最后一个签名者更改为 NO_CERTIFIED 这样他的证书就不会失效并且我添加另一个签名者(比如时间戳)使其成为 NO_CHANGES_ALLOWED 是否是常见的做法?或者有没有更好的方法来完成这个工作流程?
您的代码中有两个问题导致 Adobe Reader 报告问题。不过,我不确定在修复它们后 Adobe Reader 是否会高兴。
您工作流程中的问题是:
- 认证签名作为第二签名
- PAdES ESIC 扩展仅在首次签名后声明
认证签名作为第二个签名
首先,您的代码应用普通批准签名(PdfSigner.NOT_CERTIFIED
由 signer.SetCertificationLevel
设置)作为第一个签名,然后是认证签名(PdfSigner.CERTIFIED_NO_CHANGES_ALLOWED
由 [=12= 设置]) 作为第二个。
这是不允许的。 根据 PDF 规范 ISO 32000-1:
A PDF document may contain [...]
At most one certification signature (PDF 1.5). [...] The signature dictionary shall contain a signature reference dictionary (see Table 253) that has a DocMDP transform method. [...]
A document can contain only one signature field that contains a DocMDP transform method; it shall be the first signed field in the document.
(ISO 32000-1 第 12.8.1 和 12.8.2.2.1 节)
并且根据 ISO 32000-2:
A PDF document may contain the following standard types of signatures: [...]
One or more approval signatures (also known as recipient signatures). These shall follow the certification signature if one is present.
(ISO 32000-2 第 12.8.1 节)
无论哪种方式,批准签名都必须跟在认证签名之后,而不是在它之前。
(规范版本之间的更改很可能是为了允许文档时间戳位于认证签名之前。)
因此,在应用第二个签名后,Adobe Reader 应该立即投诉!
不过,有一种方法可以在以后的批准签名中更改认证级别:如果您的 PDF 验证器支持带有 Adobe Supplement 的 ISO 32000-1对于 ExtensionLevel 3 或 ISO 32000-2,FieldMDP 转换可用于此效果。
有关此选项的一些信息,请阅读 this answer。
PAdES ESIC 扩展仅在首次签名后声明
应用了您的第一个签名,但文档未声明应用任何 PDF 扩展名。因此,PDF 验证器可能假设对于签名验证,基本 ISO 32000-1 规则适用,特别是“不允许更改”的认证级别确实意味着 no 更改是允许的。仅当声明了适当的扩展名并且 PDF 验证器支持它时,此规则才可能有所不同。特别是
- ESIC 扩展级别 1(根据 ETSI TS 102 778-4 和 EN 319 142-1)或
- ADBE 扩展级别 5(根据 ETSI TS 102 778-4)或
- ADBE 扩展级别 8(根据 ETSI EN 319 142-1)
应该表明,正如 ISO 32000-2 同时指出的那样,
Changes to a PDF that are incremental updates which include only the data necessary to add DSS’s and/or document timestamps to the document shall not be considered as changes to the document
LTV 在您的 PDF 中添加 iText 代码然后声明 ESIC 扩展级别 5。我不确定这是从哪里来的,是否有另一个 TS 或 EN 提到了那个级别,或者 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。不过,这可能会导致其他问题。