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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline acoder84  
#1 Оставлено : 22 апреля 2013 г. 13:27:48(UTC)
acoder84

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

Группы: Участники
Зарегистрирован: 22.04.2013(UTC)
Сообщений: 12

Добрый день. Столкнулся с такой проблемой при использовании классов .net для создания подписанного сообщения.
На вызове SignedCms.ComputeSignature выдается исключение CryptographicException с кодом 0x80090020, что означает NTE_FAIL (Внутренняя ошибка).
На winxp sp3 ошибка не проявляется (пока), на w7x64 возникла только однажды, а на w8 x86 и x64(используется КриптоПРО 3.6 R3) возникает стабильно (но не каждый раз).

Начальные условия:
•Сертификаты (разумеется ГОСТ) хранятся в специально созданном хранилище, например teststore, в ветке текущего пользователя
•Установка сертификатов производится при помощи оснастки КриптоПРО 3.6
•При создании сообщения в него НЕ должен добавляться сертификат (используется IncludeOption = X509IncludeOption.None)

В чем может быть причина такого странного поведения? Как добиться нормальной работы?? Спасибо.
Вот рабочий код.

class Program
{
static void Main(string[] args)
{
X509Store store = new X509Store("teststore");
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2 cert = getCert(store);
new SignedCmsTest1().Run(cert);
store.Close();
}

private static X509Certificate2 getCert(X509Store store)
{
string sn = "000f0852542000292ac7";
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySerialNumber, sn, true);
X509Certificate2 cert = certs.Cast<X509Certificate2>().FirstOrDefault(f => f.HasPrivateKey);
Debug.Assert(cert != null, "Не удалось найти сертификат: " + sn);
return cert;
}
}

class SignedCmsTest1
{
private byte[] sign(X509Certificate2 certificate, byte[] data)
{
ContentInfo content = new ContentInfo(data);
SignedCms scms = new SignedCms(content);
CmsSigner signer = new CmsSigner(certificate) { IncludeOption = X509IncludeOption.None };
scms.ComputeSignature(signer, false); //здесь выдается исключение CryptographicException с кодом 0x80090020
return scms.Encode();
}

public void Run(X509Certificate2 cert)
{
byte[] data = new byte[100];
sign(cert, data);
}
}

Отредактировано пользователем 22 апреля 2013 г. 13:29:34(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#2 Оставлено : 22 апреля 2013 г. 14:11:24(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 728 раз в 629 постах
А где находится закрытый ключ? Вызовы многопоточные?
Знания в базе знаний, поддержка в центре поддержки
Offline acoder84  
#3 Оставлено : 22 апреля 2013 г. 14:42:19(UTC)
acoder84

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

Группы: Участники
Зарегистрирован: 22.04.2013(UTC)
Сообщений: 12

На w7 ошибка возникла, когда ключ был на e-token.
На w8 ошибка возникает, когда ключ в реестре, на виртуальном съемном диске (imdisk) или e-token.
Вызовы однопоточные. Правда не стоит забывать про GC мне кажется.
Offline Максим Коллегин  
#4 Оставлено : 22 апреля 2013 г. 14:58:19(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 728 раз в 629 постах
А можете включать source code debuging и получить стек исключения?, лучше даже вместе с исходниками (скачаются с MS)
Знания в базе знаний, поддержка в центре поддержки
Offline acoder84  
#5 Оставлено : 22 апреля 2013 г. 15:39:20(UTC)
acoder84

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

Группы: Участники
Зарегистрирован: 22.04.2013(UTC)
Сообщений: 12

Выяснил, что внутри SignedCms.ComputeSignature использует CryptMsgOpenToEncode, которая возвращает нулевой хендл сообщения после чего бросается CryptographicException с завернутым в него результатом вызова GetLastError

Это интересно.
Offline Максим Коллегин  
#6 Оставлено : 22 апреля 2013 г. 16:01:19(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 728 раз в 629 постах
Попробуйте добавить в реестр
HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Crypto Pro\\Cryptography\\CurrentVersion\\Parameters
AddEsAttribute DWORD 0
Знания в базе знаний, поддержка в центре поддержки
Offline acoder84  
#7 Оставлено : 22 апреля 2013 г. 16:22:01(UTC)
acoder84

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

Группы: Участники
Зарегистрирован: 22.04.2013(UTC)
Сообщений: 12

Попробовал на w8-x86 добавить этот параметр в эту ветку (создал сам)
и в существующую HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Cryptography\CurrentVersion\Parameters
10 раз сработало нормально на 11 сломалось.
Offline Максим Коллегин  
#8 Оставлено : 22 апреля 2013 г. 17:06:32(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 728 раз в 629 постах
Пока идей нет. А нативного стека нет?
Знания в базе знаний, поддержка в центре поддержки
Offline acoder84  
#9 Оставлено : 22 апреля 2013 г. 17:23:55(UTC)
acoder84

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

Группы: Участники
Зарегистрирован: 22.04.2013(UTC)
Сообщений: 12

Пока нет, попробую windbg
Offline acoder84  
#10 Оставлено : 23 апреля 2013 г. 10:58:43(UTC)
acoder84

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

Группы: Участники
Зарегистрирован: 22.04.2013(UTC)
Сообщений: 12

Под windbg тестовая программа ведет себя странновато. При проходе без остановок все работает нормально, много-много раз. А если встать bp на crypt32!CryptMsgOpenToEncode а потом продолжить выполнение, то выдается исключение с кодом 0x80090008 - NTE_BAD_ALGID!
С чего бы это?

Лог и сертификат во вложении.
Вложение(я):
log1.txt (8kb) загружен 5 раз(а).
Клиент1 (1kb) загружен 4 раз(а).

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