0

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

带有嵌入时间戳的 DDS

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

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

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

没有嵌入时间戳的 DDS

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

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

提前致谢!

4

1 回答 1

0

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

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

由于您使用该public GemBox.Pdf.Forms.PdfSignature GemBox.Pdf.Forms.PdfSignatureField.Sign(Func<Stream, byte> signer, PdfSignatureFormat signatureFormat, int estimatedSignatureContentsLength) 方法,这意味着您的 TSP 提供程序端点已经返回了一个CMS 编码的签名,并且这个 CMS 编码的签名在插入到签名的 PDF 文件之前必须使用时间戳进行扩充。GemBox.Pdf 目前不提供此时间戳增强功能,但我相信如果您通过其官方客户支持渠道向 GemBox 询问此功能,可以轻松添加此功能。

另一方面,如果您的 TSP 提供商还提供仅返回私钥签名值的端点,那么您可以保留 CMS 编码签名的创建(包括私钥签名值、签名者证书、嵌入式时间戳、可选验证信息(证书链、OCSP 响应和/或使签名“启用 LTV”的 CRL)以及有效 PAdES 签名所需的所有其他数据)到 GemBox.Pdf。示例组合使用外部签名对 PDF 文件进行数字签名(展示如何在 GemBox.Pdf 和返回私钥签名值的 TSP 提供程序端点之间进行互操作)和PAdES B-LT 级别(展示如何制作具有嵌入的时间戳并且“启用 LTV”)展示了如何做到这一点。

于 2022-02-16T10:30:17.910 回答