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

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline Dennisw  
#11 Оставлено : 29 октября 2009 г. 11:56:41(UTC)
Dennisw

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

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

--csptest -cmslowsign -verify -in signedattr.bin

CSP (Type:75) v3.6.5355 KC2 Release Ver:3.6.5402 OS:Windows CPU:IA32 FastCode:RE
ADY,ENABLED.
An error occurred in running the program.
.\cmslow.c:807:No user cert specified. Cryptocontext will be opened automaticaly
.
Error number 0x0 (0).
Операция успешно завершена.

The message to decode is open.
The encoded blob has been added to the message.
The message parameter (CMSG_CONTENT_PARAM) has been acquired. Message size: 961
The message param (CMSG_CONTENT_PARAM) updated. Length is 961.
Try to get user cert. OK. Length 288.
The signer info has been returned.
The message certificate store be used for verifying
A signer certificate has been retrieved.

Signature was VERIFIED.
Total: SYS: 0.016 sec USR: 0.000 sec UTC: 0.046 sec
[ErrorCode: 0x00000000]


Я так понимаю что работает?
Offline Dennisw  
#12 Оставлено : 29 октября 2009 г. 11:57:14(UTC)
Dennisw

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

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

Из хранилища сохранил сделал все как описали никаких сообщений о несоответсвии контейнеру не выдавалось.
В коде по прежнему ошибка выдается - в коде примера. Возможно конечно я не тот сертификат передаю -
но он у меня один, по трейсу я четко вижу что берется именно тот сертификат в коллекции сертификатовю
когда пытаюсь в трейсе посмотреть свойства сертификата X509Certificate2 трайс четко запрашивает пароль
к закрытому контейнеру и только после этого выдает информацию. Единственный момент при просмотре в трейсе
свойств сертификата он уже выдает другую ошибку на эту строку - "Не удается построить цепочку сертификатов для
доверенного корневого центра". Видимо какой то сбой после проверки сертификата в трайсе. если сертификат не
пытаться посмотреть в трейсе - то ошибка по прежнему остается той же.
Offline Челпанов А.  
#13 Оставлено : 29 октября 2009 г. 16:03:54(UTC)
Челпанов А.

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

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

Поблагодарили: 2 раз в 2 постах
Если коротко, то проблема в пароле на контейнер. Быстрое решение - удалить пароль с контейнера.
Позже отпишу подробнее.
С уважением, Александр.
Offline Dennisw  
#14 Оставлено : 29 октября 2009 г. 16:44:57(UTC)
Dennisw

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

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

Да Александр тоже уже начал думать об этом
сначало погонял из командной строки как вы и описали потом думаю почему в примере не спрашивает пароль на контейнер, ведь когда из командной строки запускаеш с указанием сертификата пароль запрашивается, скорее всего в этом проблема.

Пароль не хотелось бы отменять. начал копать в направлении что при подписи передавать пароль для сертификата но такого параметра не нашлось

signedCms.ComputeSignature(cmsSigner, False)

в описании написано - что значение FALSE указывает на то что пользователь должен получить приглашение на выбор сертификата
окно на запрос пароля стало выскакивать - но по прежнему присутствует ошибка "Не удается построить цепочку сертификатов для доверенного корневого центра"

Offline Dennisw  
#15 Оставлено : 29 октября 2009 г. 17:07:29(UTC)
Dennisw

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

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

Как то мне на рутокене не удалось сделать без пароля - пишет минимум 1н символ
Можно поставить галочку запомнить пароль но он просто запоминает его ну и выходит в ошибочку про цепочку сертификатов
Offline Dennisw  
#16 Оставлено : 29 октября 2009 г. 17:26:59(UTC)
Dennisw

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

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

В общем ситуация такая
я установил некий корней сертификат того сертификационного центра который выдавал нам рутокены в хранилище - Доверенные корневые центры сертификации
У нас есть рабочее место организованное от Этого центра - просто посмотрел что там есть такой сертификат и там все работает.

в конечном итоге пример заработал.

Только мне не понятно зачем нужен такой корневой сертификат ?
Можно ли избежать его присутсвия на Компьютере?
(это не принципиально, просто для себя определить)
Offline Челпанов А.  
#17 Оставлено : 29 октября 2009 г. 19:27:46(UTC)
Челпанов А.

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

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

Поблагодарили: 2 раз в 2 постах
Цитата:
Только мне не понятно зачем нужен такой корневой сертификат ?

У класса CmsSigner есть свойство IncludeOption, которое "устанавливает или возвращает параметр, который определяет, должны ли в создаваемое сообщение CMS/PKCS 7 включаться корневой сертификат и вся цепочка сертификатов, связанные с сертификатом для подписи."
В примерах приведенных подписи CMS в КриптоПро Sharpei SDK это поле нигде явно не проставляется, поэтому используется значение по умолчанию ExcludeRoot.
Таким образом при подписи делается попытки построения цепочки. Поскольку в Вашем случае корневой сертификат не находится, то выдается приведенное Вами исключение.
Цитата:
Можно ли избежать его присутсвия на Компьютере?
Да, можно, если установить для каждого подписавшего значение свойства IncludeOption в None (Цепочка сертификатов не включается.) или EndCertOnly (Включается только конечный сертификат.), в этих случаях построение цепочки при подписи производится не будет.
При проверке подписи Вам необходимо, кроме самой проверки, проверять корректность подписавшего - или Вы делаете это самостоятельно, или указывате signedCms.CheckSignature(false).
В случае EndCertOnly при подписи в сообщение будет включен только сертификат подписавшего, а при проверке корректности сертификата подписавшего промежуточные сертификаты необходимо уложить в соответствующие промежуточные store (или вручную уложить в сообщение), а корневой сертификат в root store.
В случае None при подписи необходимо уложить еще и сертификат подписывающего.
С уважением, Александр.
Offline Челпанов А.  
#18 Оставлено : 29 октября 2009 г. 20:00:10(UTC)
Челпанов А.

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

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

Поблагодарили: 2 раз в 2 постах
Теперь обещанный ответ по поводу паролей. Как подписывать CMS сообщение при помощи секретных ключей, которые имеют пароль.
1. При подписи сообщения использовать метод CmsSigner.ComputeSignature(CmsSigner signer,bool silent) со вторым параметром установленным в false. В этом случае при каждой подписи будет появляться окно КриптоПро для ввода пароля.
2. Убрать с контейнера пароль при помощи контрольной панели КриптоПро CSP. Этот метод, кроме очевидной меньшей защищенности, еще не работает для носителей с аппаратным PIN кодом (eToken, ruToken, Оскар...).
3. Открыть контейнер с секретным ключем заранее и не закрывать его пока не будут выполнены все необходимы операции подписи. Данный вариант удобен, если необходимо подписать несколько "документов" на одном ключе.
3 а) Есть сертификат certificate в MY со ссылкой на секретный ключ
Код:
Gost3410CryptoServiceProvider prov = (Gost3410CryptoServiceProvider)certificate.PrivateKey;
SecureString s = new SecureString();
// заполняем пароль... например так
s.AppendChar('1');
// и передаем его в провайдер.
prov.SetContainerPassword(s);

если необходимо, то можно сразу и проверить пароль, например, так
Код:
byte[] dummyHash = new byte[32];
p.SignHash(dummyHash);

если он не подпойдет, то будет выведено окно КриптоПро с просьбой ввести другой пароль.
и при необходимости используем этот сертификат со ссылкой на уже открытый и прогруженный ключ.
3 б) Есть сертификат (где-то) и есть секретный ключ (ему соответствующий)
Код:
CspParameters pars = new CspParameters(75, null, "test33");
// если необходимо запретить вывод окна и при неправильном пароле получить ошибку, запрещаем окна
pars.Flags = CspProviderFlags.NoPrompt;
SecureString s = new SecureString();
// заполняем пароль... например так
s.AppendChar('1');
pars.KeyPassword = s;
Gost3410CryptoServiceProvider prov = new Gost3410CryptoServiceProvider(pars);

если необходимо проверить корректность пароля делаем как уже было сделано выше
Код:
byte[] dummyHash = new byte[32];
prov.SignHash(dummyHash);

и связываем сертификат с уже открытым секретным ключем и при необходимости используем этот сертификат со ссылкой на уже открытый и прогруженный ключ.
3 в) Есть сертификат certificate в MY со ссылкой на секретный ключ. Этот метод вариация 3 б), только параметры контейнера мы получаем из ссылки на секретный ключ при помощи кода
Код:
CspKeyContainerInfo info = ((ICspAsymmetricAlgorithm)certificate.PrivateKey).CspKeyContainerInfo;
С уважением, Александр.
Offline Dennisw  
#19 Оставлено : 29 октября 2009 г. 22:23:21(UTC)
Dennisw

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

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

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