Crypto API — CryptRetrieveTimeStamp

Добрый день,

Может кто-нибудь помочь мне, используя функцию Crypto Api, CryptRetrieveTimeStamp?
Я успешно использую CryptSignMessage для подписи своего сообщения, и теперь я хочу пометить данные в TSA, но CryptRetrieveTimeStamp всегда возвращает ошибку * TRUST_E_TIME_STAMP *.

Моя функция выглядит следующим образом, pbMessage а также cbMessage данные и размер, полученные от 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);

Я знаю, что ошибка означает: Подписчик отметки времени и / или сертификат не может быть проверен или поврежден. Но я понятия не имею, что или как решить эту ошибку?

Любая помощь / советы будут оценены.
Спасибо,
Магда

0

Решение

Просмотр запроса / ответа через wireshark позволил лучше понять проблему.

TSA является действительным TSA, но кодировка была неправильной. Изменение * szOID_RSA_MD5 * на * szOID_NIST_sha256 * решило мою проблему.

1

Другие решения

MSDN

CryptRetrieveTimeStamp функция кодирует запрос метки времени и
извлекает маркер времени из местоположения, указанного в URL
Управление штамповкой времени (TSA).

Скорее всего, вы не указали действительный TSA в первом параметре, а именно:

wszUrl [в]

Указатель на строку широких символов с нулевым символом в конце, которая содержит URL TSA, на который нужно отправить запрос.

редактировать — Предлагаемое решение состоит в том, чтобы изменить полномочия для отметки времени.

0

Проблема с получением метки времени заключается в том, что она не совместима с OpenSSL … Не относится к вашему вопросу.

0