【问题标题】:iTextSharp not rendering digital signatureiTextSharp 不呈现数字签名
【发布时间】:2020-07-11 16:24:46
【问题描述】:

我已阅读 I-TEXT 数字签名电子文本,以及 MKL 之前回答的帖子(他似乎与 Bruno 一起是该主题的权威)。

基本上我有一个 Azure 应用服务,它从公司的签名 API 获取数字签名(base 64)和证书链。该公司的签名 API 返回 Base64 中的签名以及证书链。

我只想在 pdf 中插入一个签名对象/容器,以便在最终用户打开 pdf 时它会显示在签名面板中。我更喜欢使用延迟签名。

我已经从第 4 章的“clientseversigning 示例”转移到了 MKL 的“如何在不提前知道签名者证书的情况下创建 PDF 签名”中的延迟签名。

Company API 返回一个“普通”签名,我很确定,并且还返回一个 3 字符串证书链。

我应该注意我确实提前拥有根证书和子证书(2 个 .cer 文件),但我现在没有在“准备”用于散列的 pdf 中使用它们,因为延迟签名示例没有使用它们明显地。对于容器构建代码(从Company API得到响应后),我使用了company API返回的3个certs链,但我也尝试了2个.cer文件,没有成功。

我的代码与示例中的代码之间的唯一区别是不是 byte[] certificateBytes = THE_RETRIEVED_CERTIFICATE_BYTES; X509Certificate x509Certificate = new X509CertificateParser().ReadCertificate(certificateBytes);我构建了 3 个 x509Certificates(用于从 Company API 返回的链中的每个字符串。

不幸的是,我在 Acrobat 中遇到以下错误:签名无效,此签名中包含的格式或信息有错误,签名的身份尚未验证,签名时间以签名者计算机上的时钟为准...此外,如果我在 Acrobat 中单击此错误下方的证书详细信息,则它是空白的。这几乎是我在尝试“clientserversigning example”时遇到的错误

我真的很努力,想知道它可能是什么...我应该尝试从 12000 修改估计大小并提高它吗?或者我在 Acrobat 中遇到的错误,也许他们暗示来自公司 API 的证书链没有被签名延迟容器构造代码拾取......我正在努力,但任何提示都会非常感激

埃文


澄清一下,我正在关注第 4 章的客户端服务器签名示例,但是一旦使用公司 API 的签名重新创建了我的 pdf,我就会得到以下内容

它的说法1)信息格式有错误 2) 签名者的身份未经验证 3) 签名时间来自签名者电脑上的时钟

现在就在散列以发送签名之前“准备”pdf ......我在 ClientSigning 示例中没有看到任何专门准备它的内容,我可以假设 IText 库正在准备它吗?

【问题讨论】:

  • a)必须在散列要签名的字节范围之前准备 PDF(这不是整个准备好的 PDF!); b) 仅凭签名获取证书是否足够,取决于返回签名的格式。如果公司API返回CMS签名容器,则不需要之前的证书;如果是普通签名,通常需要事先提供证书。
  • “我应该看 PDFBox 而不是 Itext” - 您已表示对您的签名没有特殊要求(例如,您没有提到要创建像 PAdES-LTA 这样的特殊配置文件),所以任何一个图书馆都应该这样做。
  • github 挂了,但是这个女人有几个 pdf 库的解决方案:github.com/crs2195
  • 感谢 mkl,我只想说你是这方面的权威;我认为它是公司 API 返回的一个普通签名......我正在阅读所有文本......是否可以安全地假设如果我事先无法访问证书,而不是使用延迟歌唱示例,如果我事先确实有证书我会使用clientserversigningexample吗?换句话说,我很难区分这两者……但我想如果公司 API 只返回普通签名(请注意一串证书),它会迫使我动手,我必须使用 clientseversigningexample?
  • 只是一个附录,我确实有两个来自公司 API 的证书,root 和 sub,都是 .cer 文件。在使用 clientserversigningexample 构建对公司 api 的调用时,假设我可以使用这两个证书创建一个链是否安全?您认为公司 API 返回的链返回值有什么不同吗?

标签: pdf itext digital-signature


【解决方案1】:

对于你的问题和你的问题,你似乎对它特别感兴趣

  • 是否可以使用仅返回证书和签名的签名 API,以及
  • 何时推迟签署。

您能否使用仅在签名后提供用户证书的签名 API

要回答这个问题,首先必须澄清所讨论的签名 API 创建了什么样的签名、普通签名值(例如 PKCS#1 RSA 签名)或成熟的 CMS 签名容器。

如果它创建成熟的 CMS 签名容器,您可以按照任意签名配置文件创建签名,只要签名容器符合它们的要求(他们经常这样做)。他们唯一的限制是您不能在签名可视化中获得来自签名者证书的信息,因为该可视化是在 PDF 的签名数据中定义的。

如果它只创建普通的签名值,你能做的最好的就是创建并嵌入简单的 CMS 容器,这些容器在签名属性中不包含指向签名者证书的指针(如果它们有任何签名属性作为开头) .许多感兴趣的签名策略确实需要这样的指针,但至少 Adob​​e Reader 接受没有这样的签名。

如果您处于这种情况并想尝试使用这种简单的签名容器创建签名,您可能需要使用this answer 中的代码,“如何在不提前知道签名者证书的情况下创建 PDF 签名”部分。

何时使用延迟签名

延迟签名和其他 iText 签名调用的区别不是延迟签名需要更少的信息(与 ExternalContainer 签名相比)。

与其他 iText 签名方法相比,signDeferred重新使用 PDF 的最外层现有的填充签名字段进行签名,并且仅替换其中的签名容器。

方法名称来源于最常见的用例:

  • 在第一步中,使用signExternalContainer 使用IExternalSignatureContainer 实现(可能首先创建然后)填充签名字段,该实现计算要签名的文档哈希但尚未返回最终的CMS 容器,仅返回一些(通常)空数组。然后将生成的带有填充签名字段的 PDF(尽管没有最终签名容器)临时存储(在文件系统或数据库中)。
  • 在第二步中,请求并(可能异步地)等待已确定文档哈希的签名容器。
  • 在最后一步中,signDeferred 用于将检索到的签名容器注入到第一步准备的 PDF 中。

此延迟签名过程通常在第二步(签名容器创建和检索)的设置中首选,该设置可能需要更长的时间来阻止文档签名所需的资源。这尤其包括远程服务器或客户端生成的签名,尤其是当签名过程等待第三方许可或激活时。

【讨论】:

  • 嗨,mkl,我非常感谢你...有没有办法通过检查来区分或知道从公司 API 返回的签名是普通签名还是完整的 CMS 签名容器/查看它返回的base64string“签名”?我可以做出明智的猜测吗?
  • 遵循“this answer”代码示例...我仍然收到“签名者未知”/签名者的身份尚未验证签名面板中的错误......我'我想知道它是否与您谈论的地方有关:
  • “CMS 签名容器可以包含“签名属性”的结构。如果包含,则这些属性之一必须是签名 PDF 字节的哈希(见上文,除 Contents 值之外的所有内容)并且包装在容器中的实际签名字节对这些签名属性进行签名。是否允许没有签名属性的变体以及还需要哪些属性,取决于签名的确切类型。"
  • “我可以做出明智的猜测吗?” - 好吧,大小已经是一个提示了。小于 1KB 很可能是裸签名。超过 2KB 很可能是一个更大的结构,例如 CMS 签名容器。
  • 啊,在这种情况下,它看起来像是一个裸签名...我复制/粘贴了它返回的签名,记事本文件以 344 字节进入...请注意,这是按照您的“如何在不知道签名者证书的情况下创建 PDF 签名”。
猜你喜欢
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 2018-11-17
  • 2019-11-06
  • 2019-12-09
  • 1970-01-01
相关资源
最近更新 更多