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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline pestilina  
#1 Оставлено : 14 июля 2014 г. 9:11:48(UTC)
pestilina

Статус: Новичок

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

Мне необходимо оценить возможность формирования ЭЦП в приложении под ОС Android
Соответствующий пример CMSSignExample
При его разборе возникли вопросы

- можно ли сформировать подпись с использованием имеющегося файла сертификата - если да, то как?
- почему каждый раз при форимровании ЭЦП через тестовое приложение получается разный результат для одного и того же подписываемого сообщения и как этого избежать?
- что входит в комплект поставки крипто про для андроида?

Offline Евгений Афанасьев  
#2 Оставлено : 14 июля 2014 г. 9:35:37(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,540
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
Автор: pestilina Перейти к цитате
Мне необходимо оценить возможность формирования ЭЦП в приложении под ОС Android
Соответствующий пример CMSSignExample
При его разборе возникли вопросы

- можно ли сформировать подпись с использованием имеющегося файла сертификата - если да, то как?
- почему каждый раз при форимровании ЭЦП через тестовое приложение получается разный результат для одного и того же подписываемого сообщения и как этого избежать?
- что входит в комплект поставки крипто про для андроида?



Здравствуйте.
1) Только файла сертификата? Если да - то нет, нужен ключевой контейнер.
2) См. https://www.cryptopro.ru...dnikh-i-tekh-zhe-dannykh
3) ACSP.apk и набор библиотек: ASN1P.jar, JCSP.jar и т.д. ACSP.apk - нативный провайдер (CSP), JCSP.jar - java-криптопровайдер, который должен использоваться в вашем приложении. Более подробно в в документации дистрибутива.
Offline pestilina  
#3 Оставлено : 14 июля 2014 г. 10:08:12(UTC)
pestilina

Статус: Новичок

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

Спасибо, еще вопрос
- Возможно ли проверить, что я правильно использую код примера - сформировать ЭЦП с помощью тестового ключевого контейнера на устройстве и расшифровать его на стороне сервера? Какие файлы (тествоые файлы ключей, сертификат) необходимо иметь на стороне сервера?
Offline Евгений Афанасьев  
#4 Оставлено : 14 июля 2014 г. 10:19:29(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,540
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
Если нужно просто проверить, то сформируйте тестовый ключевой контейнер (на сервере, например, в Тестовом УЦ Крипто-Про), скопируйте его на устройство, сформируйте подпись, перенесите на сервер и проверьте либо с помощью csptest (входит в CSP), либо CMSVerify (в samples-sources.jar в пакете CMS_samples).
Offline pestilina  
#5 Оставлено : 14 июля 2014 г. 11:45:48(UTC)
pestilina

Статус: Новичок

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

Опишите, пожалуйста, подробнее процедуру формирования тестового ключевого контейнера в Тестовом УЦ Крипто-Про. https://www.cryptopro.ru/certsrv/ - здесь мало что ясно и речь в основном о сертификатах, а не о ключевых контейнерах
Offline Евгений Афанасьев  
#6 Оставлено : 15 июля 2014 г. 16:26:30(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,540
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
Нужно перейти в IE по адресу https://www.cryptopro.ru/certsrv/ (требуется установка CSP), выбрать "Сформировать ключи и отправить запрос на сертификат". Далее выбрать "Создать и выдать запрос к этому ЦС.". Затем в форме для создания запроса нужно ввести, например, "Имя" (оно, как и остальные заполненные поля, будет в сертификате). Выбрать тип сертификата ("Type of Certificate Needed") - для тестов можно оставить значение по умолчанию. Можно дать "Заданное пользователем имя контейнера ключа" и "Пометить ключ как экспортируемый". Затем нажать "Выдать", сохранить контейнер (например, в реестре) и далее произвести установку сертификата. После этого запустить панель CSP в Панели Управления, произвести копирование контейнера из реестра на диск (файловое хранилище в виде набора файлов *.key в папке). Далее этот контейнер можно перенести на устройство или импортировать на сервере (в панели CSP).

Отредактировано пользователем 15 июля 2014 г. 16:28:03(UTC)  | Причина: Не указана

Offline magistr39  
#7 Оставлено : 16 июля 2014 г. 9:37:39(UTC)
magistr39

Статус: Новичок

Группы: Участники
Зарегистрирован: 16.07.2014(UTC)
Сообщений: 2
Российская Федерация

Спасибо! оч. здесь помогли. но вот проблема еще... не знаю какой вводить пароль при входе на сайт госуслуг. вход при помощи УЭК естественно. я уже три попытки израсходовал. наверно придется восстанавливать???? Помогите!
Offline pestilina  
#8 Оставлено : 16 июля 2014 г. 12:01:51(UTC)
pestilina

Статус: Новичок

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

Спасибо большое за помощь!
Мне удалось сформировать подпись текстового сообщения, использовав нужный ключевой контейнер.
На стороне сервера подписывается xml-файл с помощью следующего кода
public static bool SignXmlDocument(string document)
{
X509Store store = null;
try
{
// Находим секретный ключ по сертификату в хранилище MY
store = new X509Store("My", StoreLocation.CurrentUser);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
SignSettings ss = new SignSettings();
ss.GetSignSettings();
X509Certificate2Collection fcollection = (X509Certificate2Collection)store.Certificates;
X509Certificate2Collection collection;
collection = X509Certificate2UI.SelectFromCollection(fcollection,
"Выберите сертификат",
"Выберите сертификат для подписания документа.", X509SelectionFlag.SingleSelection);

if (collection.Count == 0)
return false;

X509Certificate2 Certificate = collection[0];

Gost3410CryptoServiceProvider cert_key = Certificate.PrivateKey as Gost3410CryptoServiceProvider;
if (cert_key != null)
{
byte[] dummyHash = new byte[32];
cert_key.SignHash(dummyHash);
}

//CreateSomeXml("doc_to_sign.xml");

// Открываем ключ подписи.
AsymmetricAlgorithm Key = Certificate.PrivateKey;
// Создаем новый XML документ.
XmlDocument doc = new XmlDocument();
// Форматируем документ с игнорированием пробельных символов.
doc.PreserveWhitespace = false;
// Читаем документ из файла.
string xEl = System.IO.File.ReadAllText(document);
XElement xel = XElement.Load(new System.IO.StringReader(xEl));
xel.Element("Signer").Add(new XElement("CertificateNumber", Certificate.GetSerialNumberString()));
xel.Element("Signer").Add(new XElement("CertificateExpirationDate", Convert.ToDateTime(Certificate.GetExpirationDateString()).ToString("dd.MM.yyyy")));
string post = String.Empty;
string FIO = String.Empty;
GetFIOAndPostFromSert(Certificate, ref post, ref FIO);
xel.Element("Signer").Element("SignerName").SetValue(FIO);
xel.Element("Signer").Element("SigningDate").SetValue(DateTime.Now.ToString("dd.MM.yyyy HH:mm"));
xel.Element("Signer").Element("SignerPosition").SetValue(post);
//doc.Load(new XmlTextReader(document));
//doc.Load(new XmlTextReader("doc_to_sign.xml"));
doc.LoadXml(xel.ToString());

// Создаем объект SignedXml по XML документу.
SignedXml signedXml = new SignedXml(doc);
// Добавляем ключ в SignedXml документ.
signedXml.SigningKey = Key;
// Создаем ссылку на node для подписи.
// При подписи всего документа проставляем "".
Reference reference = new Reference();
reference.Uri = "";
// Явно проставляем алгоритм хеширования,
// по умолчанию SHA1.
reference.DigestMethod =
CPSignedXml.XmlDsigGost3411Url;
// Добавляем transform на подписываемые данные
// для удаления вложенной подписи.
XmlDsigEnvelopedSignatureTransform env =
new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
// Добавляем transform для канонизации.
XmlDsigC14NTransform c14 = new XmlDsigC14NTransform();
reference.AddTransform(c14);
// Добавляем ссылку на подписываемые данные
signedXml.AddReference(reference);
// Создаем объект KeyInfo.
KeyInfo keyInfo = new KeyInfo();
// Добавляем сертификат в KeyInfo
keyInfo.AddClause(new KeyInfoX509Data(Certificate));
// Добавляем KeyInfo в SignedXml.
signedXml.KeyInfo = keyInfo;
// Можно явно проставить алгоритм подписи: ГОСТ Р 34.10.
// Если сертификат ключа подписи ГОСТ Р 34.10
// и алгоритм ключа подписи не задан, то будет использован
// XmlDsigGost3410Url
//if (signedXml.SignedInfo.SignatureMethod == null)
// signedXml.SignedInfo.SignatureMethod =
// CPSignedXml.XmlDsigGost3410Url;
// Вычисляем подпись.
signedXml.ComputeSignature();
// Получаем XML представление подписи и сохраняем его
// в отдельном node.
XmlElement xmlDigitalSignature = signedXml.GetXml();
// Добавляем node подписи в XML документ.
doc.DocumentElement.AppendChild(doc.ImportNode(
xmlDigitalSignature, true));
// При наличии стартовой XML декларации ее удаляем
// (во избежание повторного сохранения)
if (doc.FirstChild is XmlDeclaration)
{
doc.RemoveChild(doc.FirstChild);
}
// Сохраняем подписанный документ в файле.
using (XmlTextWriter xmltw = new XmlTextWriter(document.Replace(".forsign_xml", ".xml"),
new UTF8Encoding(false)))
{
xmltw.WriteStartDocument();
doc.WriteTo(xmltw);
}
if (SendSignPdfToStore(document.Replace(".forsign_xml", ".xml"), DateTime.Now, "", "", ""))
return true;
else
return false;
// bool r = VerifyXmlFile(document.Replace(".forsign_xml", ".xml"));
// return r;
}
catch (Exception ex)
{
LogWriter.Write(String.Format("SignXmlDocument({0}) {1}", document, ex.Message));
MessageBox.Show("Ошибка при создании подписи.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
finally
{
if (store != null)
store.Close();
}
}


Весь код просматривать необязательно, главное, что подпись xml тут производится не просто как подипсь текствоого сообщения. Если я подписываю тот же xml файл как строку со стороны клиента, то подпись не верифицируется со стороны сервера и наоборот, видимо разные алгоритмы. То есть подпись xml имеет свои особенности и это не просто подпись строки (хеш подписываемых данных у нас совпадает, подписываем мы точно одно и то же). Не совсем понимаю, как мне следует подписать xml, чтобы он верифицировался на сервере (на клиенте моя подпись верифицируется) В примерах нет подобной объектной обработки и подписи xml (из этого я ошибочно заключила, что подписав xml как строку, получу тот же валидируемый на сервере результат). Подскажите, пожалуйста, как быть и есть ли способ описать процесс подписи на андроид-девайсе чтобы он был аналогичен коду, представленному выше и все верифицировалось.
Offline magistr39  
#9 Оставлено : 16 июля 2014 г. 12:27:48(UTC)
magistr39

Статус: Новичок

Группы: Участники
Зарегистрирован: 16.07.2014(UTC)
Сообщений: 2
Российская Федерация

Спасибо! оч. здесь помогли. но вот проблема еще... не знаю какой вводить пароль при входе на сайт госуслуг. вход при помощи УЭК естественно. я уже три попытки израсходовал. наверно придется восстанавливать???? Помогите
Offline Евгений Афанасьев  
#10 Оставлено : 16 июля 2014 г. 12:30:37(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,540
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
Примеров XML подписи в android пока нет, этот функционал на совместимость еще никак не тестировался.

Автор: magistr39 Перейти к цитате
Спасибо! оч. здесь помогли. но вот проблема еще... не знаю какой вводить пароль при входе на сайт госуслуг. вход при помощи УЭК естественно. я уже три попытки израсходовал. наверно придется восстанавливать???? Помогите

Не совсем понятно, где вводится пароль. В браузере на устройстве?


Offline Евгений Афанасьев  
#11 Оставлено : 16 июля 2014 г. 12:31:35(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,540
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
Автор: pestilina Перейти к цитате
Подскажите, пожалуйста, как быть и есть ли способ описать процесс подписи на андроид-девайсе чтобы он был аналогичен коду, представленному выше и все верифицировалось.

Примеров XML подписи в android пока нет, этот функционал на совместимость еще никак не тестировался.

Автор: magistr39 Перейти к цитате
Спасибо! оч. здесь помогли. но вот проблема еще... не знаю какой вводить пароль при входе на сайт госуслуг. вход при помощи УЭК естественно. я уже три попытки израсходовал. наверно придется восстанавливать???? Помогите

Не совсем понятно, где вводится пароль. В браузере на устройстве?

Offline pestilina  
#12 Оставлено : 16 июля 2014 г. 12:38:08(UTC)
pestilina

Статус: Новичок

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

Примеров нет, это очень жаль.. а есть какие-то классы или инструменты для подписи xml файлов с андроида в предоставляемых библиотеках? Или прямо вообще ничего пока?
Offline Евгений Афанасьев  
#13 Оставлено : 16 июля 2014 г. 13:09:50(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,540
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
В состав samples.jar входят примеры, в обычном дистрибутиве JCP есть JCPxml.jar, можете попробовать запустить примеры с ним.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.