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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Dennisw  
#1 Оставлено : 28 октября 2009 г. 14:26:20(UTC)
Dennisw

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

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

Добрый День

При выполнении примера указанного в SAMPLES - SignedAttribute.vb выдается ошибка "Неправильный открытый ключ поставщика."

выводится в этой части кода:

' Подписываем CMS/PKCS #7 сообение.
Console.Write("Вычисляем подпись сообщения для субъекта " & _
"{0} ... ", signerCert.SubjectName.Name)
signedCms.ComputeSignature(cmsSigner) --> В этой строке ошибка
Console.WriteLine("Успешно.")

Сертификат - Состав - Открытый ключ - > ГОСТ 34.10 - 2001 (512)

При использовании Тестового сертификата от Крипто-Про - Состав - Открытый ключ - > RSA (1024)
Пример отрабатывает.

получается при использовании ГОСТ сертификатов я не могу по такой технологии производить подписывание документов?
или проблема с моими сертификатами?

Спасибо!
Offline Челпанов А.  
#2 Оставлено : 28 октября 2009 г. 14:54:12(UTC)
Челпанов А.

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

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

Поблагодарили: 2 раз в 2 постах
Этот пример должен работать на ключах алгоритма ГОСТ.
Проблема или в ключах (сертификате, секретном ключе) или в CSP.
Запустите из директории "C:\Program Files\Crypto Pro\Sharpei\"
alarm.exe info
Будет создан файл osinfo.txt
его и сертификат прикрепите к сообщению.
С уважением, Александр.
Offline Dennisw  
#3 Оставлено : 28 октября 2009 г. 15:11:39(UTC)
Dennisw

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

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

osinfo + сертификат

Отредактировано пользователем 28 октября 2009 г. 15:27:19(UTC)  | Причина: Не указана

Вложение(я):
osinfo.txt (13kb) загружен 66 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Челпанов А.  
#4 Оставлено : 28 октября 2009 г. 15:55:55(UTC)
Челпанов А.

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

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

Поблагодарили: 2 раз в 2 постах
Скорее всего в найденном сертификате открытый ключ не соответствует секретному. Есть несколько вариантов.
1. Сгенерировать новую пару секретный - открытый ключ - сертификат и проверить работоспособность на ней.
2. Переустановить сертификат из контейнера (если он там есть) в store my и убедиться, что пример использует именно этот переустановленный сертификат (поиск сертификата осуществляется по подстроке, список всех сертификатов выводится в примере).
С уважением, Александр.
Offline Dennisw  
#5 Оставлено : 28 октября 2009 г. 16:38:55(UTC)
Dennisw

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

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

Александр что бы все правильно понимать просто для себя

1. я удалил сейчас из контейнера Личное все сертификаты с которыми тестируюсь
2. захожу в CSP - > Сервис - жму Установить личный сертификат - выбираю файл для импорта - потом контейнер секретного ключа (ключ лежит на РуТокене). Или просмотреть сертификат в контейнере и его дальнейшая установка в хранилище.
3. просматриваю что в хранилище есть сертификат

Далее Запускаю пример и использую в примере именно этот сертификат

Последовательность правильная ? или что то не так делаю?
Offline Челпанов А.  
#6 Оставлено : 28 октября 2009 г. 16:54:07(UTC)
Челпанов А.

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

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

Поблагодарили: 2 раз в 2 постах
1. Удалить из хранилища (store) Личное все сертификаты.
2. Считаем, что у Вас в контейнере установлен правильный сертификат. Панель CSP/Просмотреть сертификаты в контейнере. Выбираете контейнер. Далее. Свойства. Install Certificate....
3. Убеждаетесь что в хранилище MY только один сертификат с данным именем.
С уважением, Александр.
Offline Dennisw  
#7 Оставлено : 28 октября 2009 г. 17:09:45(UTC)
Dennisw

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

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

Нет все то же самое
как то можно проверить правильный ли сертификат в хранилище?
проверил другие примеры EnvelopedMultipleRecipients, EnvelopedSingleRecipient в этих примерах нет работы с подписями как в SignedAttribute

EnvelopedMultipleRecipients, EnvelopedSingleRecipient - эти примеры отрабатывают без ошибок
Offline Dennisw  
#8 Оставлено : 28 октября 2009 г. 17:11:11(UTC)
Dennisw

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

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

проверил еще на двух сертификатах (все одного сертификац. центра) - результат тот же
ощущение что не правильные сертификаты - или кривые руки)))
Offline Челпанов А.  
#9 Оставлено : 28 октября 2009 г. 18:10:08(UTC)
Челпанов А.

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

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

Поблагодарили: 2 раз в 2 постах
Можно еще попробовать:
Цитата:
csptest -cmslowsign -sign -in a.txt -out signedattr.bin -add -my certname

подпись файла a.txt в файл signedattr.bin используя сертификат certname из хранилища my
Цитата:
csptest -cmslowsign -verify -in signedattr.bin

проверка подписи под файлом.
Утилита csptest находится в "C:\Program Files\Crypto Pro\CSP\csptest.exe"

Проверить соответствие сертификата секретному ключу можно через контрольную панель.
1. из хранилища MY сохранить сертификат в файл, скажем c:\my.cer
2. Запустить контрольную панель CSP/Сервис/Установить личный сертификат/Ввести c::\my.cer/Далее/Далее/Выбрать контейнер/Далее
3 а) Если сертификат не соответствует контейнеру, то увидите диалоговое окно
Закрытый ключ на указанном контейнере не соответствует открытому ключу в сертификате, выберите другой ключевой контейнер
3 б) появится окно выбора хранилища.
С уважением, Александр.
Offline Dennisw  
#10 Оставлено : 29 октября 2009 г. 11:53:45(UTC)
Dennisw

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

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

--csptest -cmslowsign -sign -in a.txt -out signedattr.bin -add -my certname

CSP (Type:75) v3.6.5355 KC2 Release Ver:3.6.5402 OS:Windows CPU:IA32 FastCode:RE
ADY,ENABLED.
#0:
Subject: .............Valid : 01.10.2009 - 01.10.2010
Issuer : E=support_ca@astra-st.ru, C=RU, L=Chelyabinsk, O=Astra-ST, OU=Certifica
te Authority, CN=Astra-ST Root CA

A CSP has been acquired.
The length of the data has been calculated.
The message to be encoded has been opened.
Content has been added to the encoded message.
Message encoded successfully.
Output file (c:\tmp\signedattr.bin) has been saved
Total: SYS: 0.047 sec USR: 0.000 sec UTC: 9.936 sec
[ErrorCode: 0x00000000]

Отредактировано пользователем 29 октября 2009 г. 11:56:09(UTC)  | Причина: Не указана

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 Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.