如何向 TSP 颁发的现有数字签名添加嵌入式时间戳

How can I add an embedded timestamp to an existing digital signature that was issued by a TSP

我正在尝试为 .pdf 文档实现带有嵌入式时间戳的 PAdES 数字签名。即,我要实现的目标:

DDS with an embedded timestamp

我正在使用执行 DDS 的可信提供商(TSP;外部方),因此我无权访问 TSP 用于签署消息摘要的私钥(.pfx 证书)。我一直在使用 GemBox 的 .NET class 库,并成功地使用以下函数将数字签名添加到 .pdf 文件:

Gembox.Pdf.Form.PdfSignature Sign(Func<Stream, byte[]> signer, PdfSignatureFormat signatureFormat, int estimatedSignatureContentsLength) 

我为参数“signer”(见上面的函数)传递了另一个函数,它简单地从 TSP 提供商调用端点,returns 移动签名(作为字节 [])。然后签名成功添加.pdf文件(使用GemBox的签名过程):

DDS with no embeeded timestamp

现在我需要在签名中添加嵌入式时间戳,但我不确定如何实现,因为 DDS 来自外部方。我遇到的所有代码示例都假设您拥有 .pfx 证书,即 DDS 与时间戳一起执行(参见 here),在我的情况下,我将不得不提出要求我的 TSP 为我提供 DDS,其中包括来自受信任提供商的时间戳。

我希望有人能在这里为我指明正确的方向,并向我解释这是否真的可行,即在从外部方填充 DDS 时添加嵌入式时间戳。请注意,如果需要,我愿意探索其他 .NET 库,即 GemBox 以外的库。但是,我发现该库对于其他用途也非常有用。

提前致谢!

是的,可以在创建签名后将时间戳嵌入到签名中,因此您的 TSP 无需为您提供包含时间戳的 DDS。

时间戳通常在创建签名的同时添加,因为 PDF 签名过程需要您首先估计签名的大小,并且估计的大小可能小于额外嵌入时间戳所需的大小.因此,首先对一些虚拟数据进行时间戳以找出时间戳的大小,并将该大小包含在签名的估计大小的计算中。

自从您使用 public GemBox.Pdf.Forms.PdfSignature GemBox.Pdf.Forms.PdfSignatureField.Sign(Func<Stream, byte> signer, PdfSignatureFormat signatureFormat, int estimatedSignatureContentsLength) 方法,这意味着您的 TSP 提供商端点已经 returns 一个 CMS-encoded 签名,并且此 CMS-encoded 签名必须在插入到签名的 PDF 文件之前增加时间戳。 GemBox.Pdf 目前不提供这种时间戳扩充,但我相信如果您通过他们的官方客户支持渠道向 GemBox 询问,这可以很容易地添加。

另一方面,如果您的 TSP 提供商还提供了 returns 只是私钥签名值的端点,那么您可以留下 CMS-encoded 签名(包括私钥签名)的创建值、签名者证书、嵌入式时间戳、可选验证信息(证书链、OCSP 响应 and/or 使签名“启用 LTV”的 CRL)以及有效 PAdES 签名所需的所有其他数据)到 GemBox.Pdf。示例组合 Digitally sign a PDF file with an external signature (shows how to interoperate between GemBox.Pdf and your TSP provider endpoint that returns the private key signature value) and PAdES B-LT level(显示如何制作具有嵌入式时间戳且“启用 LTV”的 PAdES 签名)显示如何完成此操作。