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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline alegul  
#1 Оставлено : 25 февраля 2011 г. 14:06:12(UTC)
alegul

Статус: Участник

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

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Максим Коллегин  
#2 Оставлено : 25 февраля 2011 г. 14:24:41(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,393
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 717 раз в 621 постах
определите CRYPT_SIGN_MESSAGE_PARA_HAS_CMS_FIELDS перед включением Wincrypt.h
Знания в базе знаний, поддержка в техподдержке
Offline alegul  
#3 Оставлено : 25 февраля 2011 г. 15:46:30(UTC)
alegul

Статус: Участник

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

Offline Максим Коллегин  
#4 Оставлено : 25 февраля 2011 г. 16:23:18(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,393
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 717 раз в 621 постах
чему равен signPara.cbSize = sizeof(signPara)?
Знания в базе знаний, поддержка в техподдержке
Offline alegul  
#5 Оставлено : 25 февраля 2011 г. 16:56:38(UTC)
alegul

Статус: Участник

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

Offline Максим Коллегин  
#6 Оставлено : 25 февраля 2011 г. 17:20:51(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,393
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 717 раз в 621 постах
Значит это ни при чем. Давайте целиком воспроизводимый пример на С.
Знания в базе знаний, поддержка в техподдержке
Offline alegul  
#7 Оставлено : 3 марта 2011 г. 22:02:30(UTC)
alegul

Статус: Участник

Группы: Участники
Зарегистрирован: 12.01.2011(UTC)
Сообщений: 17
Мужчина
Откуда: Москва

При подготовке примера обнаружил ошибку у себя. У нас проект на Java, и функции CryptoApi дёргаются через JNI.
В метод подписи передаётся массив jint, который содержит указатели на ранее созданные контексты сертификатов, которые надо включить в CMS.
Этот массив приводится к PCERT_CONTEXT *. На 32хбитной платформе это работало, т.к. длина jint и указателя составляет 4 байта, а на 64битной нет, т.к. jint так же занимает 4 байта, а указатель уже 8.

Получался массив кривых указателей.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.