0

再会,

有人可以帮我使用 Crypto Api 函数 CryptRetrieveTimeStamp 吗?我成功地使用 CryptSignMessage 对我的消息进行签名,现在我想在 TSA 上为数据添加时间戳,但 CryptRetrieveTimeStamp 总是返回 *TRUST_E_TIME_STAMP* 错误。

我的函数如下所示,pbMessagecbMessage是从 CryptSignMessage 接收的数据和大小:

PCRYPT_TIMESTAMP_CONTEXT tcontext = NULL;
HCERTSTORE hStore = NULL;


fReturn = CryptRetrieveTimeStamp(widestr.c_str(),
       TIMESTAMP_NO_AUTH_RETRIEVAL, 
       0, 
       szOID_RSA_MD5, 
       NULL, 
       (const BYTE*)pbMessage, 
       cbMessage, 
       &tcontext, 
       NULL, 
       &hStore);

我知道错误意味着:时间戳签名者和/或证书无法验证或格式错误。但我不知道什么或如何解决这个错误?

任何帮助/提示将不胜感激。谢谢,玛格达

4

3 回答 3

1

通过wireshark 查看请求/响应可以更好地了解问题。

TSA 是有效的 TSA,但编码错误。将 *szOID_RSA_MD5* 更改为 *szOID_NIST_sha256* 解决了我的问题。

于 2013-09-06T12:43:34.620 回答
0

MSDN -

CryptRetrieveTimeStamp函数对时间戳请求进行编码,并将时间戳令牌从 URL 指定的位置检索到时间戳权威 (TSA)。

很可能您没有在第一个参数中提供有效的 TSA,即 -

wszUrl[在]

指向以空字符结尾的宽字符串的指针,该字符串包含要向其发送请求的 TSA 的 URL。

编辑- 建议的解决方案是更改时间戳权限。

于 2013-09-02T08:17:54.357 回答
0

时间戳检索的问题在于它与 OpenSSL 不兼容……但与您的问题无关。

于 2016-08-04T21:16:50.327 回答