Статус: Активный участник
Группы: Участники
Зарегистрирован: 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) Пример отрабатывает.
получается при использовании ГОСТ сертификатов я не могу по такой технологии производить подписывание документов? или проблема с моими сертификатами?
Спасибо!
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390  Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Этот пример должен работать на ключах алгоритма ГОСТ. Проблема или в ключах (сертификате, секретном ключе) или в CSP. Запустите из директории "C:\Program Files\Crypto Pro\Sharpei\" alarm.exe info Будет создан файл osinfo.txt его и сертификат прикрепите к сообщению.
|
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
osinfo + сертификат Отредактировано пользователем 28 октября 2009 г. 15:27:19(UTC)
| Причина: Не указана Вложение(я):  osinfo.txt (13kb) загружен 66 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390  Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Скорее всего в найденном сертификате открытый ключ не соответствует секретному. Есть несколько вариантов. 1. Сгенерировать новую пару секретный - открытый ключ - сертификат и проверить работоспособность на ней. 2. Переустановить сертификат из контейнера (если он там есть) в store my и убедиться, что пример использует именно этот переустановленный сертификат (поиск сертификата осуществляется по подстроке, список всех сертификатов выводится в примере).
|
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
Александр что бы все правильно понимать просто для себя
1. я удалил сейчас из контейнера Личное все сертификаты с которыми тестируюсь 2. захожу в CSP - > Сервис - жму Установить личный сертификат - выбираю файл для импорта - потом контейнер секретного ключа (ключ лежит на РуТокене). Или просмотреть сертификат в контейнере и его дальнейшая установка в хранилище. 3. просматриваю что в хранилище есть сертификат
Далее Запускаю пример и использую в примере именно этот сертификат
Последовательность правильная ? или что то не так делаю?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390  Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
1. Удалить из хранилища (store) Личное все сертификаты. 2. Считаем, что у Вас в контейнере установлен правильный сертификат. Панель CSP/Просмотреть сертификаты в контейнере. Выбираете контейнер. Далее. Свойства. Install Certificate.... 3. Убеждаетесь что в хранилище MY только один сертификат с данным именем. |
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
Нет все то же самое как то можно проверить правильный ли сертификат в хранилище? проверил другие примеры EnvelopedMultipleRecipients, EnvelopedSingleRecipient в этих примерах нет работы с подписями как в SignedAttribute
EnvelopedMultipleRecipients, EnvelopedSingleRecipient - эти примеры отрабатывают без ошибок
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
проверил еще на двух сертификатах (все одного сертификац. центра) - результат тот же ощущение что не правильные сертификаты - или кривые руки)))
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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 б) появится окно выбора хранилища. |
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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]
Я так понимаю что работает?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
Из хранилища сохранил сделал все как описали никаких сообщений о несоответсвии контейнеру не выдавалось. В коде по прежнему ошибка выдается - в коде примера. Возможно конечно я не тот сертификат передаю - но он у меня один, по трейсу я четко вижу что берется именно тот сертификат в коллекции сертификатовю когда пытаюсь в трейсе посмотреть свойства сертификата X509Certificate2 трайс четко запрашивает пароль к закрытому контейнеру и только после этого выдает информацию. Единственный момент при просмотре в трейсе свойств сертификата он уже выдает другую ошибку на эту строку - "Не удается построить цепочку сертификатов для доверенного корневого центра". Видимо какой то сбой после проверки сертификата в трайсе. если сертификат не пытаться посмотреть в трейсе - то ошибка по прежнему остается той же.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390  Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Если коротко, то проблема в пароле на контейнер. Быстрое решение - удалить пароль с контейнера. Позже отпишу подробнее. |
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
Да Александр тоже уже начал думать об этом сначало погонял из командной строки как вы и описали потом думаю почему в примере не спрашивает пароль на контейнер, ведь когда из командной строки запускаеш с указанием сертификата пароль запрашивается, скорее всего в этом проблема.
Пароль не хотелось бы отменять. начал копать в направлении что при подписи передавать пароль для сертификата но такого параметра не нашлось
signedCms.ComputeSignature(cmsSigner, False)
в описании написано - что значение FALSE указывает на то что пользователь должен получить приглашение на выбор сертификата окно на запрос пароля стало выскакивать - но по прежнему присутствует ошибка "Не удается построить цепочку сертификатов для доверенного корневого центра"
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
Как то мне на рутокене не удалось сделать без пароля - пишет минимум 1н символ Можно поставить галочку запомнить пароль но он просто запоминает его ну и выходит в ошибочку про цепочку сертификатов
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
В общем ситуация такая я установил некий корней сертификат того сертификационного центра который выдавал нам рутокены в хранилище - Доверенные корневые центры сертификации У нас есть рабочее место организованное от Этого центра - просто посмотрел что там есть такой сертификат и там все работает.
в конечном итоге пример заработал.
Только мне не понятно зачем нужен такой корневой сертификат ? Можно ли избежать его присутсвия на Компьютере? (это не принципиально, просто для себя определить)
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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 при подписи необходимо уложить еще и сертификат подписывающего. |
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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;
|
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
Спасибо за примеры и уделенное время Александр. Будем дальше разбираться, пробовать)
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close