【问题标题】:Steps to include timestamp in PDF signature在 PDF 签名中包含时间戳的步骤
【发布时间】:2013-09-12 10:39:51
【问题描述】:

早安,

我正在尝试将时间戳信息嵌入到 pdf 签名中,以便 adobe 向我报告签名是时间戳。目前,我所做的只是 Adob​​e 报告“签名包含嵌入的时间戳,但无法验证”,当您查看日期/时间属性时,它说“时间戳授权”不可用并且“显示证书”是灰色的。

显然,我在构建 PKCS#7 消息时做错了。但我现在不知道。 有人可以通过描述我需要采取的步骤来帮助我,以便为我的签名加盖时间戳吗?或者建议一个可以帮助我找到问题的工具?

我正在使用加密 API。我目前遵循的步骤如下:

  1. 使用 CryptHashMessage 函数 (SHA256) 创建 pdf 数据的摘要。
  2. 使用 CryptRetrieveTimeStamp 函数将此摘要发送到 TSA。我设置了 *TIMESTAMP_DONT_HASH_DATA* 标志,这样摘要就不会再次被散列。
  3. 来自 TSA 的回复作为未经身份验证的属性添加到 *CRYPT_SIGN_MESSAGE_PARA* 结构中,并且签名时间作为经过身份验证的属性添加。
  4. 然后我使用 CryptSignMessage 函数对使用上述结构的原始数据进行签名。

如何检查数据是否正确,以便 adobe 向我显示签名已加盖时间戳?

问候, 玛格达

【问题讨论】:

  • 您能分享一个示例 PDF 吗?此外,您的 Adob​​e Reader 是否信任您的 TSA?
  • 我已经使用 Adob​​e 的默认安全性和相同的 TSA 签署了一份 pdf,它显示了正确的信息。我的 pdf:link。使用adobes默认安全签名的pdf:link
  • 你会修复链接吗?我还想以编程方式对 pdf 进行签名和时间戳。

标签: pdf digital-signature cryptoapi trusted-timestamp


【解决方案1】:

简而言之:您在为错误的数据添加时间戳,请参阅答案底部。

您的签名与 Adob​​e 的签名之间的主要区别:

  1. Adobe 的签名包含一个签名的撤销信息属性;该属性不包含任何实际的撤销信息。

    因为这个属性是可选的,所以这里不应该相关。

  2. 您的签名包含签名时间属性。

    由于您还嵌入了时间戳,因此不需要签名时间,但也不禁止。

  3. 您的签名的 signatureAlgorithm 值为 1.2.840.113549.1.1.1,即 RSA 加密,而 Adob​​e 的值为 1.2.840.113549.1.1.11,即 sha256WithRSAEncryption p>

    这里 Adob​​e 的选择肯定是更好的选择,但 Adob​​e Reader 似乎忽略了您签名中的缺陷:毕竟,它说文档自签名以来没有更改。

  4. 在您的签名中,时间戳标记 PDF 文档的哈希,即与签名的已签名 messageDigest 属性相同,而在 Adob​​e 的签名中,时间戳标记不同。

    砰。这就是问题。诚然,您在最初的问题中说过,但没有引起我的注意:

    1. 使用 CryptHashMessage 函数 (SHA256) 创建 pdf 数据的摘要。

    2. 使用 CryptRetrieveTimeStamp 函数将此摘要发送到 TSA。我已经设置了 TIMESTAMP_DONT_HASH_DATA 标志,这样摘要就不会再次被散列。

    这是错误的!根据规范,时间戳作为无符号属性添加:

作为无符号属性的时间戳信息 (PDF 1.6):时间戳令牌应符合 RFC 3161 并应按照 RFC 3161 的附录 A 中的描述计算并嵌入到 PKCS#7 对象中。

ISO 32000-1 第 12.8.3.3.1 节)

*And RFC 3161 states:*

TimeStampToken 中的 messageImprint 字段的值应该是 SignerInfo 中的签名字段值的哈希值,用于被标记的签名数据。

RFC 3161 的附录 A)

*Thus, **you are time stamping the wrong hash!** Adobe correctly expects you to time stamp the signature. So you should first create a regular signature, then look up its signature value, hash & time stamp that value, and then add that time stamp to the signature container signer info as unsigned time stamp attribute.*

*Unfortunately I don't know the Windows Crypto API well enough to explain how to do that; I'm more at home in the Java crypto api.*

【讨论】:

    【解决方案2】:

    时间戳未正确完成。 检查我的mime library。您需要添加一个 oID 为“1.2.840.113549.1.9.16.2.14”的未经身份验证的字段。

    【讨论】:

    • 显然 op 做到了。否则,adobe reader 根本不会识别时间戳的存在。您在这里似乎只想宣传您的 mime 库。
    • 我不需要做广告。
    • 在这种情况下,我想知道您的答案是什么,因为 OP 必须已经添加了您所描述的时间戳,否则 Adob​​e Reader 将不会报告“签名包含嵌入式时间戳”开始.
    猜你喜欢
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多