Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline astarukhin  
#1 Оставлено : 5 ноября 2024 г. 15:04:29(UTC)
astarukhin

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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

Понятно, что нужно как-то восстановить данные о сертификате, имея его идентификатор

Не могли бы вы подсказать как это сделать?


Offline Андрей *  
#2 Оставлено : 5 ноября 2024 г. 15:35:06(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,318
Мужчина
Российская Федерация

Сказал «Спасибо»: 549 раз
Поблагодарили: 2207 раз в 1722 постах
Здравствуйте.

stVerifyMessagePara.pfnGetSignerCertificate
- crypt_verify_message_para

далее:
- pfn_crypt_get_signer_certificate
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#3 Оставлено : 5 ноября 2024 г. 15:36:59(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,318
Мужчина
Российская Федерация

Сказал «Спасибо»: 549 раз
Поблагодарили: 2207 раз в 1722 постах
Автор: astarukhin Перейти к цитате

Понятно, что нужно как-то восстановить данные о сертификате, имея его идентификатор

Не могли бы вы подсказать как это сделать?




А пробовали добавить сертификат в хранилище Другие пользователи\AddessBook?

или из файла будете потом читать сертификат?
Техническую поддержку оказываем тут
Наша база знаний
Offline astarukhin  
#4 Оставлено : 6 ноября 2024 г. 8:33:41(UTC)
astarukhin

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.12.2021(UTC)
Сообщений: 36
Российская Федерация

Сказал(а) «Спасибо»: 5 раз
Сертификат живёт в контейнере(например на флешке).
Offline astarukhin  
#5 Оставлено : 6 ноября 2024 г. 8:51:28(UTC)
astarukhin

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.12.2021(UTC)
Сообщений: 36
Российская Федерация

Сказал(а) «Спасибо»: 5 раз
Если я правильно понимаю, то шаги должны быть следующие:

1) Превращаем байты подписи в структуру данных
2) Достаём от туда признак сертификата
3) Достаём сертификат по этому признаку
4) используем метод, который принимает данные, подпись и сертификат для верификации

И мне пока не понятно, какие методы в АПИ это позволяют сделать
Offline Андрей *  
#6 Оставлено : 6 ноября 2024 г. 12:11:13(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,318
Мужчина
Российская Федерация

Сказал «Спасибо»: 549 раз
Поблагодарили: 2207 раз в 1722 постах
Автор: astarukhin Перейти к цитате
Сертификат живёт в контейнере(например на флешке).


Вы собрались передавать контейнер? Нет.

Выше написана функция, читали описание? Находите сертификат и возвращаете его через неё.

p.s.
какой смысл в отсутствии сертификата в cms?
Техническую поддержку оказываем тут
Наша база знаний
Offline astarukhin  
#7 Оставлено : 7 ноября 2024 г. 9:51:13(UTC)
astarukhin

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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 (все остальные поля пусты)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.