我们能够以一种方式对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
我们的签名代码是digitalsignature指南中给出的presign / postsign servlet的转换。
我错过了什么?
答案 0 :(得分:3)
我书中的presign / postsign示例已过时。您应该使用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
接口。您可以根据要使用的签名基础结构来实现它。