Статус: Участник
Группы: Участники
Зарегистрирован: 25.12.2008(UTC) Сообщений: 25 Откуда: Че
|
С помощью функций CryptoAPI сформировал я подпись в формате PKCS#7 Формат правильный поскольку, утилита certutil -v отработала и отобразила сертификат, которым подписано. но проблемы начинаются при верификации подписи средствами того же CryptoAPI. Изначально использовал функцию CryptVerifyDetachedMessageSignature(...), заполняя параметры верификации так: Код:
CRYPT_VERIFY_MESSAGE_PARA VerifyPara;
ZeroMemory(&VerifyPara, sizeof(VerifyPara));
VerifyPara.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);
VerifyPara.hCryptProv = NULL;
VerifyPara.dwMsgAndCertEncodingType = MY_TYPE;
//VerifyPara.pfnGetSignerCertificate = NULL;
VerifyPara.pfnGetSignerCertificate = NULL;
VerifyPara.pvGetArg = NULL;
на что функция возвращала FALSE и GetLastError() равным CRYPT_E_NOT_FOUND курение гугла, яндекса и прочих наркотических веществ привело меня к использованию низкоуровневых функций сообщений. в итоге пришёл к таким результатам 1) создаю и заполняю сообщение типа HCRYPTMSG Код: msg = CryptMsgOpenToDecode(pVerifyPara->dwMsgAndCertEncodingType,
CMSG_DETACHED_FLAG, 0, pVerifyPara->hCryptProv, NULL, NULL);
ret = CryptMsgUpdate(msg, pbDetachedSignBlob, cbDetachedSignBlob, TRUE);
if(ret) {
DWORD i;
for (i = 0; ret && i < cToBeSigned; i++) {
ret = CryptMsgUpdate(msg, rgpbToBeSigned[i], rgcbToBeSigned[i],
i == cToBeSigned - 1 ? TRUE : FALSE);
}
2) из этого сообщения прекрасно извлекается информация о сертификате типа CERT_INFO Код: CERT_INFO *certInfo = CRYPT_GetSignerCertInfoFromMsg(msg, dwSignerIndex);
if (certInfo!=NULL) {
char d[100];
DWORD CStr = 100;
CryptBinaryToString (certInfo->SerialNumber.pbData,
certInfo->SerialNumber.cbData,
CRYPT_STRING_HEX, d, & CStr);
printf("\n cert sn = %s \n",d);
}
3) безошибочно открываю хранилище сертификатов Код: HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_MSG,
pVerifyPara->dwMsgAndCertEncodingType,
pVerifyPara->hCryptProv, 0, msg);
4) но это хранилище не содержит в себе сертификата! то есть этот код Код: PCCERT_CONTEXT cert = CertFindCertificateInStore(store, pVerifyPara->dwMsgAndCertEncodingType, 0,
CERT_FIND_SUBJECT_CERT, certInfo, NULL);
и возвращает CRYPT_E_NOT_FOUND взятие Enumiration сертификатов в этом хранилище тоже не даёт никаких результатов. в чём может быть проблема? зы. файлы q.html и q.sign - это данные и подпись под ними. Отредактировано пользователем 19 мая 2010 г. 15:37:29(UTC)
| Причина: Не указана Вложение(я):  q.sign (1kb) загружен 11 раз(а). q.html (2kb) загружен 13 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 25.12.2008(UTC) Сообщений: 25 Откуда: Че
|
всё, проблему решил. оказывается, во время подписания надо было указывать в структуре отдельно какие сертификаты включать в подпись Код: SigParams.cMsgCert = 1;
SigParams.rgpMsgCert = &pSigner;
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close