手动将数字签名添加到 pdf 文件的标准方法?

信息安全 证书 公钥基础设施 证书颁发机构 电子签名 x.509
2021-08-28 01:24:07

我创建了一些证书供自己使用,但在创建包含数字签名的证书时,我发现自己被难住了。首先,我将如何创建一个标准证书,它不再只包含公共字段,而是包含数字签名的字段。其次,我如何手动将此证书作为数据附加到相应的 pdf 文件中?

谢谢!

4个回答

根据您对其他答案的评论,您实际上想要

使用 [your] 证书签署 pdf 文件,然后保存此签名并将其附加到 [you] 刚刚签署的 pdf 文件中。

(顺便说一句,您使用与证书中的公钥关联的私钥进行签名,而不是使用证书本身,但这是一个细节。)

我假设您希望以符合标准的 PDF 查看器(例如 Adob​​e Reader)将其识别、显示和验证为集成 PDF 签名的方式将签名“附加”到 PDF。

在这种情况下,您已经开始错误地按原样签署原始 PDF,并期望现在只需以某种方式将该签名附加到文件中。相反,您必须构建 PDF 文档的新修订版,其中包括 PDF AcroForm 签名字段,其值为签名字典,其/Contents条目包含整个新修订版的签名,但/Contents条目内容除外。

嵌入在 PDF 中的签名

如果要将多个签名集成到 PDF 中,则可以通过增量 PDF 更新来完成(明确不是通过将多个 SignerInfo 结构添加到单个集成的 CMS 签名容器!):

多重签名和增量更新

这在 PDF 中的 Adob​​e 文档数字签名中以图形和更详细的方式进行了解释此外,它在 PDF 规范 ISO 32000-1:2008 中由 Adob​​e在第 12.8 节数字签名中提供。

不过要注意!规范说:

字节范围摘要应在文件中的字节范围内计算,应由签名字典中的 ByteRange 条目指示。该范围应该是整个文件,包括签名字典但不包括签名值本身(内容条目)。可以使用其他范围,但由于它们不会检查文档的所有更改,因此不建议使用它们。

这似乎允许您首先为原始 PDF 创建一个签名,然后附加一个持有该签名的新修订版,指示该签名字节范围仅包含该原始修订版,而不是仅包含签名的扩展修订版。

但实际上,PDF 查看器(尤其是 Adob​​e Reader)只会接受遵循签名范围应该是整个文件的建议的签名,包括签名字典但不包括签名值本身。

较新的规范,例如 ETSI PAdES 规范 ETSI TS 102 778(参见第 2 部分中的第 5.1 节 b 项第 3 部分中的第 4.2 节第 c 项)甚至将此建议正式作为要求,ISO 32000-2 也是如此。

根据您的编程环境,有许多支持创建集成 PDF 签名的 PDF 库以及许多使用这些库的产品。其中一些甚至可以免费获得,例如 AGPL。

由于证书已注册给您并且填写了您的详细信息的字段,因此证书就是您的数字签名。您不向证书添加数字签名。

您需要由 CA(您可以创建)颁发的证书。然后将证书添加到您的受信任证书(如果自签名或不是来自标准认可的 CA)。创建 PDF 文件时,您可以选择使用该证书对文件进行签名。该证书签名是您的数字签名...

这里有一个不错的 HowTo 从 2009 年开始,但仍然有效:http ://blog.didierstevens.com/2009/01/04/howto-add-a-digital-signature-to-a-pdf-file/

证书始终包含签名,但在其本身上,而不是在某些 PDF 文档上。该签名是证书的组成部分,由颁发证书的 CA 计算;这是通过验证此签名,任何软件都可以获得对证书内容的信任。所有这些都独立于任何 PDF 文件发生,并且可能在 PDF 文件存在之前就已经存在了。

当您“使用证书”签署文档时,您实际上是在使用您的私钥在 PDF 上计算签名——私钥不在您的证书中,但证书包含相应的公钥然后,签名本身和您的证书副本应包含在 PDF 文件中。

Adobe 文档可以使用其 Reader 和 Acrobat 产品计算签名。显然可以使用免费软件来完成。

您的问题实际上是两个不同的问题。如果需要信任链,则证书仅需要由另一个证书签名。例如,根 CA 将对他们颁发的证书进行签名,以便任何尝试验证证书的人都知道它是受 CA 信任的。您可以使用任何允许证书签名的证书进行这种链接。

另一方面,对于文档,您只需要经过客户端身份验证批准的证书。如果您运行自己的 CA,您的证书可能会被批准用于任何目的,但会缺乏您以外的任何人的信任。要签署 PDF,您只需将证书导入 Acrobat,然后使用身份对文档进行签名。