如何为时间戳签名启用LTV并设置不允许更改pdf?

1 java certificate itext digital-signature

我正在使用数字证书签署 pdf iText。现在我可以签名并添加 LTV,但证书级别可以是:

signatureAppearance.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_FORM_FILLING_AND_ANNOTATIONS);
Run Code Online (Sandbox Code Playgroud)

我只想设置PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED. 最终结果应如下所示:

在此输入图像描述

sap.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED);
MakeSignature.signDetached(signatureAppearance, privateKey, "SHA-512", chain, null, ocspClient, tsaClient, 0, MakeSignature.CryptoStandard.CADES);
Run Code Online (Sandbox Code Playgroud)

如果我使用上面的代码进行签名,那么使用AdobeLtvEnabling.java添加LTV在使用ACROBAT检查时会提示签名无效,因为添加LTV时该文件正在修改不可修改的PDF文件。那么,我该怎么做才能达到最终的效果呢?

mkl*_*mkl 6

要获得像快照中那样的结果,即“不允许更改”和“签名已启用 LTV”而没有任何后续签名或文档时间戳,您必须

\n\n
    \n
  • 要么已将 Adob​​e 验证程序所需的所有 LTV 材料包含到您的原始签名修订版中
  • \n
  • 或者使用签名模式,允许您附加 LTV 材料,尽管不允许进行任何更改。
  • \n
\n\n

不幸的是,后一种变体似乎尚未得到 Adob​​e Acrobat Reader 的正确支持。

\n\n

有关详细信息,请参阅以下部分。

\n\n

将所有 LTV 材料纳入原始签名修订版中

\n\n

首先,这并不总是可能的。如果你想在原始签名版本中拥有LTV材料,它必须是签名数据的一部分,所以你必须在签名之前收集它。但是,在许多使用远程签名服务的设置中,您在实际请求签名之前并不知道将使用哪个签名证书。

\n\n

不过,如果可能的话,即如果您提前知道签名证书,则可以使用此堆栈溢出答案AdobeLtvEnabling中的类来包含如下信息:

\n\n
PdfStamper stamper = PdfStamper.createSignature(...);\n\nAdobeLtvEnabling adobeLtvEnabling = new AdobeLtvEnabling(stamper);\nOcspClient ocsp = new OcspClientBouncyCastle();\nCrlClient crl = new CrlClientOnline();\nadobeLtvEnabling.addLtvForChain(YOUR_SIGNER_CERTIFICATE, ocsp, crl, PdfName.A);\nadobeLtvEnabling.outputDss();\n\n[...preparing your signature...]\nMakeSignature.signDetached(...);\n
Run Code Online (Sandbox Code Playgroud)\n\n

CreateSignatureComodo测试testCreateLtvNoChangesAllowedCertification

\n\n

您可能必须为此公开AdobeLtvEnabling方法addLtvForChain和方法,因为最初不打算这样使用。outputDssAdobeLtvEnabling

\n\n

结果:

\n\n

截屏

\n\n

使用允许附加 LTV 材料但仅允许附加其他内容的签名模式

\n\n

或者,您可以以允许以后添加 LTV 材料的方式签署 PDF,尽管有“不允许更改”认证。

\n\n

首先,如果您想在应用签名后将 LTV 材料添加到 PDF,则必须使用首先为 PAdES 签名指定的机制。虽然此机制同时已包含在 ISO 32000-2 中,但它在普通的 ISO 32000-1 环境中不可用。不过,由于您的屏幕截图是 Adob​​e Acrobat,因此这对您来说不应该是问题。

\n\n

这种机制就是文档安全存储。iText 类和此堆栈溢出答案中的LtvVerification类都填充了 PDF 中的此类存储。AdobeLtvEnabling

\n\n

尽管有“不允许更改”认证,是否仍允许添加这些文档安全存储?\xe2\x80\x94 这取决于...

\n\n

如果您的 PDF 是 PDF-2.0:是的。ISO 32000-2 描述了某些认证允许或不允许的更改,如下所示:

\n\n
\n

对 PDF 的更改是增量更新,仅包括添加 DSS\xe2\x80\x99s 所需的数据 12.8.4.3,“文档安全存储 (DSS)”和/或文档时间戳 12.8.5,“文档时间戳 (DTS)对文档的“词典”不应被视为对以下选项中定义的文档的更改。

\n
\n\n

(ISO 32000-2,表 257 \xe2\x80\x94 DocMDP 转换参数字典中的条目)

\n\n

如果您的 PDF 是启用了 PAdES 扩展的 PDF-1.x:是。ETSI EN 319 142-1 要求

\n\n
\n

DocMDP 限制(参见 ISO 32000-1 1,第 12.8.2.2 条)不适用于包含 DSS 字典和相关 VRI、证书、CRL 和 OCSP 的 PDF 文档的增量更新。

\n\n

...

\n\n

评估 DocMDP 限制时(请参阅 ISO 32000-1 1,第 12.8.2.2 条)时,应忽略文档\n 时间戳字典项的存在。

\n
\n\n

(ETSI EN 319 142-1 V1.1.1,第 5.4 节验证数据和存档验证数据属性)

\n\n

但如果您的 PDF 是普通 PDF-1.x:不!

\n\n

因此,如果您想使用此选项并在签名后添加 LTV 信息,请确保您最初认证的 PDF 是 PDF-2 或至少启用了 PAdES 扩展。

\n\n

虽然 iText 5 不支持 PDF-2,但使用它创建 PAdES 样式签名会添加 PAdES 扩展。

\n\n

因此,如果您认证 PAdES 样式,即使认证“不允许更改”,您也应该能够启用 LTV 签名。

\n\n

Adobe Acrobat Reader DC 2019.008.20080 支持

\n\n

进行了一些测试,扩展了仅包含 LTV 信息的无更改允许认证 PDF,该 PDF 被标记为具有适当 ETSI 和 Adob​​e 扩展的 PDF-1.7 或 PDF-2.0,看来 Adob​​e Acrobat 既不支持 ETSI EN 319 142 -1 或 ISO 32000-2 尚未完全:在所有测试中,它都认为认证已被破坏,参见。CreateSignatureComodo测试testCreateNoChangesAllowedCertificationAndLtv

\n\n

因此,目前要获得启用 LTV 且不允许更改的文档并让 Adob​​e Acrobat 识别这一点,只有上述第一个选项,即将所有 LTV 材料包含到原始签名修订版中。

\n\n

解决方法可能是创建允许表单填写的认证,然后添加 LTV 信息,然后使用另一个(批准)签名进行签名,该签名通过其字段锁定字典和 FieldMDP 转换将文档更改为不允许更改,参见 CreateSignatureComodo测试testCreateCertificationAndLtvAndNoChangesAllowed。不过,由于知识渊博的人可以删除该签名的增量更新,因此这远非完美。

\n\n

解决方法的结果:

\n\n

截屏

\n