Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.12.2021(UTC) Сообщений: 36 Сказал(а) «Спасибо»: 5 раз
|
Здравствуйте! Есть следующая задача. Формируется подпись в формате PKCS7 без включения сертификата Вот так собираются её параметры Цитата: CRYPT_SIGN_MESSAGE_PARA SigParams; SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA); SigParams.dwMsgEncodingType = SUPPORTED_ENCODINGS; SigParams.pSigningCert = pCertContext; SigParams.HashAlgorithm.pszObjId = GetHashOidByKeyOid( SigParams.pSigningCert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId); SigParams.HashAlgorithm.Parameters.cbData = 0; SigParams.cMsgCert = 0; SigParams.cAuthAttr = 0; SigParams.dwInnerContentType = 0; SigParams.cMsgCrl = 0; SigParams.cUnauthAttr = 0; SigParams.dwFlags = DW_FLAGS_DEFAULT_VAL; SigParams.pvHashAuxInfo = nullptr; SigParams.rgAuthAttr = nullptr; Затем другим запросом пытаемся проверить Цитата:VerifyResult CspVerifier::Verify(const VerifyData& data) { CRYPT_VERIFY_MESSAGE_PARA stVerifyMessagePara; stVerifyMessagePara.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA); stVerifyMessagePara.dwMsgAndCertEncodingType = SUPPORTED_ENCODINGS; stVerifyMessagePara.pfnGetSignerCertificate = nullptr; stVerifyMessagePara.pvGetArg = nullptr; return stVerifyMessagePara;
DWORD dwSignatureSize = boost::numeric_cast<DWORD>(data.decSign.size()); BYTE* pbSignatureData = (BYTE*)data.decSign.data();
const BYTE* messageArray[NUMBER_OF_ELEMENTS] = { (BYTE*)data.decMessage.data() }; DWORD messageSizeArray[NUMBER_OF_ELEMENTS] = { boost::numeric_cast<DWORD>(data.decMessage.size()) };
auto result = CryptVerifyDetachedMessageSignature( &stVerifyMessagePara, SIGNATURE_INDEX, pbSignatureData, dwSignatureSize, NUMBER_OF_ELEMENTS, messageArray, messageSizeArray, nullptr);
ExceptionUtils::ThrowIfFalse(result, "Подпись PKCS7 не прошла проверку");
return VerifyResult::Success(); } Получаем ошибку 80092004 Понятно, что нужно как-то восстановить данные о сертификате, имея его идентификатор Не могли бы вы подсказать как это сделать?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,320 Сказал «Спасибо»: 549 раз Поблагодарили: 2207 раз в 1722 постах
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,320 Сказал «Спасибо»: 549 раз Поблагодарили: 2207 раз в 1722 постах
|
Автор: astarukhin Понятно, что нужно как-то восстановить данные о сертификате, имея его идентификатор
Не могли бы вы подсказать как это сделать?
А пробовали добавить сертификат в хранилище Другие пользователи\AddessBook? или из файла будете потом читать сертификат? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.12.2021(UTC) Сообщений: 36 Сказал(а) «Спасибо»: 5 раз
|
Сертификат живёт в контейнере(например на флешке).
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.12.2021(UTC) Сообщений: 36 Сказал(а) «Спасибо»: 5 раз
|
Если я правильно понимаю, то шаги должны быть следующие:
1) Превращаем байты подписи в структуру данных 2) Достаём от туда признак сертификата 3) Достаём сертификат по этому признаку 4) используем метод, который принимает данные, подпись и сертификат для верификации
И мне пока не понятно, какие методы в АПИ это позволяют сделать
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,320 Сказал «Спасибо»: 549 раз Поблагодарили: 2207 раз в 1722 постах
|
Автор: astarukhin Сертификат живёт в контейнере(например на флешке). Вы собрались передавать контейнер? Нет. Выше написана функция, читали описание? Находите сертификат и возвращаете его через неё. p.s. какой смысл в отсутствии сертификата в cms? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.12.2021(UTC) Сообщений: 36 Сказал(а) «Спасибо»: 5 раз
|
Это всё мне нужно для обслуживания нашего сервиса работы с цифровым рублём Поэтому необходимо писать сервис подписывания на C++ В числе требований - подпись, которая не содержит сертификат и её проверка и я пока пытаюсь понять, как получить сертификат Цитата: PCCERT_CONTEXT PfnCryptGetSignerCertificate( void *pvGetArg, DWORD dwCertEncodingType, PCERT_INFO pSignerId, HCERTSTORE hMsgCertStore ) { return (PCCERT_CONTEXT)pvGetArg; }
В этом обработчике я могу получить hMsgCertStore(хотя при подписывании имел дело с дескриптором контейнера, а не Store) и из pSignerId SerialNumber и Issuer (все остальные поля пусты)
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close