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文件。那么,我该怎么做才能达到最终的效果呢?
要获得像快照中那样的结果,即“不允许更改”和“签名已启用 LTV”而没有任何后续签名或文档时间戳,您必须
\n\n不幸的是,后一种变体似乎尚未得到 Adobe Acrobat Reader 的正确支持。
\n\n有关详细信息,请参阅以下部分。
\n\n首先,这并不总是可能的。如果你想在原始签名版本中拥有LTV材料,它必须是签名数据的一部分,所以你必须在签名之前收集它。但是,在许多使用远程签名服务的设置中,您在实际请求签名之前并不知道将使用哪个签名证书。
\n\n不过,如果可能的话,即如果您提前知道签名证书,则可以使用此堆栈溢出答案AdobeLtvEnabling中的类来包含如下信息:
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(...);\nRun Code Online (Sandbox Code Playgroud)\n\n(CreateSignatureComodo测试testCreateLtvNoChangesAllowedCertification)
您可能必须为此公开AdobeLtvEnabling方法addLtvForChain和方法,因为最初不打算这样使用。outputDssAdobeLtvEnabling
结果:
\n\n\n\n或者,您可以以允许以后添加 LTV 材料的方式签署 PDF,尽管有“不允许更改”认证。
\n\n首先,如果您想在应用签名后将 LTV 材料添加到 PDF,则必须使用首先为 PAdES 签名指定的机制。虽然此机制同时已包含在 ISO 32000-2 中,但它在普通的 ISO 32000-1 环境中不可用。不过,由于您的屏幕截图是 Adobe Acrobat,因此这对您来说不应该是问题。
\n\n这种机制就是文档安全存储。iText 类和此堆栈溢出答案中的LtvVerification类都填充了 PDF 中的此类存储。AdobeLtvEnabling
尽管有“不允许更改”认证,是否仍允许添加这些文档安全存储?\xe2\x80\x94 这取决于...
\n\n如果您的 PDF 是 PDF-2.0:是的。ISO 32000-2 描述了某些认证允许或不允许的更改,如下所示:
\n\n\n\n\n对 PDF 的更改是增量更新,仅包括添加 DSS\xe2\x80\x99s 所需的数据 12.8.4.3,“文档安全存储 (DSS)”和/或文档时间戳 12.8.5,“文档时间戳 (DTS)对文档的“词典”不应被视为对以下选项中定义的文档的更改。
\n
(ISO 32000-2,表 257 \xe2\x80\x94 DocMDP 转换参数字典中的条目)
\n\n如果您的 PDF 是启用了 PAdES 扩展的 PDF-1.x:是。ETSI EN 319 142-1 要求
\n\n\n\n\nDocMDP 限制(参见 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
(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进行了一些测试,扩展了仅包含 LTV 信息的无更改允许认证 PDF,该 PDF 被标记为具有适当 ETSI 和 Adobe 扩展的 PDF-1.7 或 PDF-2.0,看来 Adobe Acrobat 既不支持 ETSI EN 319 142 -1 或 ISO 32000-2 尚未完全:在所有测试中,它都认为认证已被破坏,参见。CreateSignatureComodo测试testCreateNoChangesAllowedCertificationAndLtv。
因此,目前要获得启用 LTV 且不允许更改的文档并让 Adobe Acrobat 识别这一点,只有上述第一个选项,即将所有 LTV 材料包含到原始签名修订版中。
\n\n解决方法可能是创建允许表单填写的认证,然后添加 LTV 信息,然后使用另一个(批准)签名进行签名,该签名通过其字段锁定字典和 FieldMDP 转换将文档更改为不允许更改,参见 CreateSignatureComodo测试testCreateCertificationAndLtvAndNoChangesAllowed。不过,由于知识渊博的人可以删除该签名的增量更新,因此这远非完美。
解决方法的结果:
\n\n\n