PDF外部签名问题与嵌入证书

本文关键字:证书 问题 外部 PDF | 更新日期: 2023-09-27 18:12:33

我们能够以一种方式对PDF进行外部签名,它进行验证,但证书不可见。通过一个更改,我们可以获得显示的证书,但随后PDF不再验证。

我们编写的代码或多或少与我们在网上找到的所有示例行相同。

当使用:

PdfSignature(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_SHA1);

我们得到一个验证的pdf,但是证书在pdf中不可见。在FoxIT阅读器中,"显示证书"按钮被禁用。

当我们把它改成:

PdfSignature(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);

启用了显示证书按钮(在Foxit Reader中),并显示证书,但不再验证PDF。它表明:

Signature is INVALID
The document has been altered or corrupted since the Signature was applied
Certified by the current user

我们的签名代码是数字签名指南中给出的预签名/后签名servlet的转换。

我错过了什么?

PDF外部签名问题与嵌入证书

我书中的设计/后期示例已经过时了。您应该使用C4_09_DeferredSigning示例。

首先使用空白签名:

ExternalSignatureContainer external =
    new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
MakeSignature.signExternalContainer(appearance, external, 8192);

这将导致无效签名。

然后使用这个带有无效签名的PDF来添加真实签名:

ExternalSignatureContainer external = new MyExternalSignatureContainer(pk, chain);
MakeSignature.signDeferred(reader, fieldname, os, external);

MYExternalSignatureContainer实现ExternalSignatureContainer接口。这取决于您想要使用哪种签名基础设施来实现它。