Форум КриптоПро
»
Устаревшие продукты
»
КриптоПро CSP 3.6
»
Ошибка подписи 0x80090020. КриптоПро 3.6 + Windows Server 2003 R2 Standard x64 Edition SP2
Статус: Участник
Группы: Участники
Зарегистрирован: 12.01.2011(UTC) Сообщений: 17 Откуда: Москва
|
Добрый день! В ОС Windows Server 2003 R2 Standard x64 Edition SP2 возникает ошибка подписи посредством КриптоПро 3.6. Пробовались варианты КриптоПро: Версия ядра СКЗИ: 3.6.5355 КС1, Версия продукта: 3.6.5402 Версия ядра СКЗИ: 3.6.5359 КС1, Версия продукта: 3.6.6497 (это вроде последняя версия) При использовании функции CryptSignMessage возникает ошибка "Внутренняя ошибка. (0x80090020)". Ошибка возникает только если в параметрах cMsgCert, rgpMsgCert заданы сертификаты для включения в CMS-контейнер. Если сертификаты не заданы (т.е. rgpMsgCert=NULL, cMsgCert=0), подпись проходит успешно. Пример кода ниже. Этот же код успешно работает на Windows Server 2003 R2 Enterprise Edition SP 2 + КриптоПро 3.0 Прошу подсказать, в каком направлении копать для решения проблемы. Лог msinfo32 вложен. Код:
PCCERT_CONTEXT* rgpMsgCert;
CRYPT_SIGN_MESSAGE_PARA signPara;
::memset(&signPara, 0, sizeof(signPara));
signPara.cbSize = sizeof(signPara);
signPara.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
signPara.pSigningCert = pSignerCertContext;
signPara.HashAlgorithm.pszObjId = pszHashOID;
signPara.HashAlgorithm.Parameters.pbData = NULL;
signPara.HashAlgorithm.Parameters.cbData = 0;
signPara.pvHashAuxInfo = NULL;
signPara.cMsgCert = cMsgCert;
signPara.rgpMsgCert = rgpMsgCert;
signPara.cMsgCrl = 0;
signPara.rgpMsgCrl = NULL;
signPara.cAuthAttr = cAuthAttr;
signPara.rgAuthAttr = rgAuthAttr;
signPara.cUnauthAttr = cUnauthAttr;
signPara.rgUnauthAttr = rgUnauthAttr;
signPara.dwFlags = 0;
signPara.dwInnerContentType = 0;
if (!::CryptSignMessage(&signPara, TRUE, 1, &pbMessage,
&cbMessage, NULL, &cbSignedBlob)) {
DWORD dwLastError = ::GetLastError(); // попадаем сюда, в dwLastError "Внутренняя ошибка. (0x80090020)"
}
Отредактировано пользователем 25 февраля 2011 г. 14:24:37(UTC)
| Причина: Не указана Вложение(я): msinfo32.log (275kb) загружен 11 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
определите CRYPT_SIGN_MESSAGE_PARA_HAS_CMS_FIELDS перед включением Wincrypt.h |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.01.2011(UTC) Сообщений: 17 Откуда: Москва
|
У меня в проекте явно wincrypt.h не включается. Включается windows.h, который уже включает wincrypt.h. Соответственно я попробовал сделать так: Код:#define CRYPT_SIGN_MESSAGE_PARA_HAS_CMS_FIELDS
#include [windows.h]
(где [] - угловые скобки), но это не помогло. Ошибка осталась та же. Отредактировано пользователем 25 февраля 2011 г. 16:09:12(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
чему равен signPara.cbSize = sizeof(signPara)? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.01.2011(UTC) Сообщений: 17 Откуда: Москва
|
152 Проверил на Windows Server 2003 R2 Enterprise Edition SP 2 + КриптоПро 3.0 (где ошибки нет). Там signPara.cbSize равен 84. Отредактировано пользователем 25 февраля 2011 г. 17:06:11(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
Значит это ни при чем. Давайте целиком воспроизводимый пример на С. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.01.2011(UTC) Сообщений: 17 Откуда: Москва
|
При подготовке примера обнаружил ошибку у себя. У нас проект на Java, и функции CryptoApi дёргаются через JNI. В метод подписи передаётся массив jint, который содержит указатели на ранее созданные контексты сертификатов, которые надо включить в CMS. Этот массив приводится к PCERT_CONTEXT *. На 32хбитной платформе это работало, т.к. длина jint и указателя составляет 4 байта, а на 64битной нет, т.к. jint так же занимает 4 байта, а указатель уже 8.
Получался массив кривых указателей.
|
|
|
|
Форум КриптоПро
»
Устаревшие продукты
»
КриптоПро CSP 3.6
»
Ошибка подписи 0x80090020. КриптоПро 3.6 + Windows Server 2003 R2 Standard x64 Edition SP2
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close