当前位置: 首页 > 知识库问答 >
问题:

使用iTextSharp将多个数字签名插入PDF

赵晨
2023-03-14

我正在使用iTextSharp&pkcs11RsaSignature在PDF文档的每一页插入数字签名。以下是我的代码:

        PdfReader pdfSource = new PdfReader(...);
        NumberOfPages = pdfSource.NumberOfPages;
        pdfSource.Close();
        CurrentPage = 1;

        while (CurrentPage <= NumberOfPages)
        {
            Temp3PDF = Temp1PDF;
            Temp1PDF = Temp2PDF;
            Temp2PDF = Temp3PDF;

            PdfReader pdfSrc = new PdfReader(Temp1PDF);
            FileStream pdfDes = new FileStream(Temp2PDF, FileMode.Create);
            PdfStamper pdfStamper = PdfStamper.CreateSignature(pdfSrc, pdfDes, '\0', Path.GetTempFileName(), true);                
            PdfSignatureAppearance pdfSignAppearance = pdfStamper.SignatureAppearance;
            pdfSignAppearance.Acro6Layers = false;
            pdfSignAppearance.SetVisibleSignature(new iTextSharp.text.Rectangle(100, 100, 250, 150), CurrentPage, null);
            MakeSignature.SignDetached(pdfSignAppearance, pkcs11RsaSignature, certPath, null, null, null, 0, CryptoStandard.CADES);
            pdfStamper.Close();
            pdfDes.Close();
            pdfSrc.Close();
            CurrentPage++;
        }

可以看出,这不是一种非常优雅的编程方式,因为文件的读写次数与页数一样多。是否有其他方法在PDF文件的每一页插入数字签名。

这里实际上要做的是--如果PDF文档被拆分为页(将来),因为内容没有改变,所以技术上数字签名应该对它签署的页有效。但我知道签名会作废的。(重新表述问题--是否有任何方法只对pdf的一页进行数字签名,而不是对整个文档进行数字签名?)

对Bruno Lowagie(您是专家):除了PDF规范中没有提供之外,通过对仅在选定组件上计算的哈希签名,可以对PDF文件进行部分签名。您认为是否有可能升级PDF格式规格以适应这些要求。谢谢你的帮助。

共有1个答案

印嘉泽
2023-03-14

这里实际上要做的是--如果PDF文档被拆分为页(将来),因为内容没有改变,所以技术上数字签名应该对它签署的页有效。

这种思路是建立在一种错误观念的基础上的。是的,您可以在一个特定页面上可视化签名,但在密码学上,除了嵌入式CMS签名容器本身之外,签名对整个PDF进行签名。

但你自己发现的。因此,让我们考虑一下你重新表述的问题:

过去有两种方式可以允许在单页上签名:

  • 使用对象摘要聚焦于所讨论的页面;
  • 使用的字节范围摘要仅包含与所讨论的页面相关的对象的字节范围。

然而,现在,这些技术不再是可用的选项,因为

    null
    null
 类似资料:
  • 我在iText web上遵循了这个示例(http://gitlab.itextsupport.com/itextsharp/tutorial/blob/master/signatures/chapter5/C5_03_CertificateValidation/C5_03_CertificateValidation.cs),但结果与我预期的不一样。具体地说,当试图通过OCSP或CRL验证签名时,结

  • 我对iTextSharp有意见。我有一个带有表单字段的文档,并且我已经为签名生成了字段。当第一个人在文件上签字时,它就会正常工作。Adobe Reader显示有效签名。当我让第二个人在文档上签名时,Adobe Reader显示签名1现在是“未知签名”,签名无效。Adobe reader显示: 此签名中包含的格式或信息有错误(支持信息:SigDict/Contents非法数据)

  • 出身背景 我使用iTextSharp已经有一段时间了。我已经创建了一个带有两个可签名的PdfFormFields的pdf文档。如果我打开pdf文档,我可以手动对每个字段进行手动签名。我希望通过iTextSharp完成这件事。 我目前正在从X509Store检索证书。直到现在,我都能弄明白。 问题 有人能告诉我如何使用X509Certificate2签署一个已经存在的签名字段吗。 工具书类 以下参考

  • 我已经阅读了I-TEXT数字签名电子文本,以及MKL(他似乎和布鲁诺一起是这个主题的权威)回答的以前的帖子。 本质上,我有一个Azure应用程序服务,它从公司的签名API获得数字签名(基础64)和证书链。该公司的签名API在Base64中返回签名以及证书链。 我只想在pdf中插入一个签名对象/容器,这样当最终用户打开pdf时,它就会显示在签名面板中。我更喜欢使用延期签名。 可悲的是,事情不能工作,

  • 我正在尝试使用远程web服务来演唱pdf,该服务返回一个XML签名,该签名由签名和最终用户证书组成。 我需要使用此签名通过IText签名对pdf进行签名,因为web服务。 所有IText示例都使用消息格式,但我不确定应该如何处理XML签名。 打开临时Pdf并嵌入接收到的签名的代码 从web服务返回的XML签名: 当我将返回的签名与上面的代码一起使用时,签名验证失败,出现“错误遇到时BER解码”。