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

时间:2014-07-11 11:50:09

标签: c# itextsharp itext digital-signature

我们能够以一种方式对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的转换。

我错过了什么?

1 个答案:

答案 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接口。您可以根据要使用的签名基础结构来实现它。