美好的一天,
我正在尝试将时间戳信息嵌入到pdf签名中,以便adobe会向我报告签名是时间戳。目前,我所获得的只是Adobe报告“签名包含嵌入式时间戳,但无法验证”,当您查看日期/时间属性时,它表示“时间戳授权”不可用和“显示证书“是灰色的。
显然,我在构建PKCS#7消息时做错了。但我现在不知道。 有人可以通过描述我需要采取的步骤来帮助我,以便我的签名有时间戳吗?或者建议一个可以帮助我找到问题的工具?
我正在使用Crypto API。我目前遵循的步骤如下:
如何检查数据是否正确,以便adobe可以告诉我签名已加上时间戳?
此致 玛格达
答案 0 :(得分:7)
简而言之:您的时间戳错了数据,请参阅答案的底部。
您的签名与Adobe签名之间存在重大差异:
Adobe的签名包含已签名的吊销信息属性;此属性不包含任何实际的吊销信息。
由于此属性是可选的,因此在此处不应该相关。
您的签名包含签名的签名时间属性。
由于您还嵌入了时间戳,因此不需要签名时间,但也不禁止签名。
您的签名的signatureAlgorithm值为1.2.840.113549.1.1.1,即 RSA加密,而Adobe为1.2.840.113549.1.1.11,即 sha256WithRSAEncryption
这里Adobe的选择肯定是更好的选择,但Adobe Reader似乎忽略了签名中的缺陷:毕竟,它说文档自签名以来没有被更改过。
< / LI>在您的签名中,时间戳标记PDF文档的哈希值,即与签名的签名messageDigest属性相同,而在Adobe的签名中,时间戳标记不同的。
BANG。这就是问题。不可否认,你在原来的问题中说过,但它并没有引起我的注意:
使用CryptHashMessage函数(SHA256)创建pdf数据的摘要。
使用CryptRetrieveTimeStamp函数将此摘要发送到TSA。我已经设置了* TIMESTAMP_DONT_HASH_DATA *标志,以便不再对哈希值进行哈希处理。
这是错的!根据规范
,时间戳被添加为无符号属性时间戳信息作为无符号属性(PDF 1.6):时间戳令牌应符合RFC 3161,并应按照RFC 3161附录A中的描述计算并嵌入到PKCS#7对象中。
(ISO 32000-1的第12.8.3.3.1节)
RFC 3161声明:
TimeStampToken中messageImprint字段的值应为SignerInfo中签名字段值的哈希值,以便对带有时间戳的signedData进行处理。
(RFC 3161的附录A)
因此,您的时间戳错了! Adobe正确地希望您为签名加盖时间戳。所以你应该首先创建一个常规签名,然后查找它的签名值,hash&amp;时间戳记该值,然后将该时间戳添加到签名容器签名者信息中作为无符号时间戳属性。
不幸的是,我不知道Windows Crypto API是否足以解释如何做到这一点;我更喜欢Java加密api。
答案 1 :(得分:0)
时间戳未正确完成。 检查我的mime library。您需要添加一个带有oID“1.2.840.113549.1.9.16.2.14”的未经身份验证的字段。