Добрый день,
Может кто-нибудь помочь мне, используя функцию 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);
Я знаю, что ошибка означает: Подписчик отметки времени и / или сертификат не может быть проверен или поврежден. Но я понятия не имею, что или как решить эту ошибку?
Любая помощь / советы будут оценены.
Спасибо,
Магда
Просмотр запроса / ответа через wireshark позволил лучше понять проблему.
TSA является действительным TSA, но кодировка была неправильной. Изменение * szOID_RSA_MD5 * на * szOID_NIST_sha256 * решило мою проблему.
MSDN —
CryptRetrieveTimeStamp
функция кодирует запрос метки времени и
извлекает маркер времени из местоположения, указанного в URL
Управление штамповкой времени (TSA).
Скорее всего, вы не указали действительный TSA в первом параметре, а именно:
wszUrl
[в]Указатель на строку широких символов с нулевым символом в конце, которая содержит URL TSA, на который нужно отправить запрос.
редактировать — Предлагаемое решение состоит в том, чтобы изменить полномочия для отметки времени.
Проблема с получением метки времени заключается в том, что она не совместима с OpenSSL … Не относится к вашему вопросу.