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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Alexey2020  
#1 Оставлено : 13 ноября 2020 г. 21:56:13(UTC)
Alexey2020

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

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

Сказал(а) «Спасибо»: 1 раз
Добрый день!
при попытке написать программу для подписи строки в формате base64, и получении открепленной подписи в формате base64, получилось нечто следующее
Код:

import static com.sign2.CMS_samples.CMS.createCMS;


String password = "123456";
String alias = "Alias_Name";  
String content = "PE1lc3NhZ2V..1lc3NhZ2VDb250ZW50QmFzZT4=" // сами данные

// Грузим хранилище.
        KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME);
        keyStore.load(null, null);
// Получаем ключ и сертификат.
        PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password);
        final Certificate certificate = keyStore.getCertificate(alias);

        Signature signature = Signature.getInstance("CryptoProSignature_2012_256", "JCP"); // так работает, почему не понятно, это значение взято отсюда https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=93435#post93435
        //Signature.getInstance("GOST3410_2012_256", "JCP"); // так падает

        signature.initSign(privateKey);

        byte[] a = content.getBytes(StandardCharsets.UTF_8);
        signature.update(a);

        byte[] b = createCMS(a, signature.sign(), certificate, false);

        content = Base64.getEncoder().encodeToString(b);
return content;


это работает, не правильно подписывает, так как при проверке подписи вот здесь: https://dss.cryptopro.ru/Verify/Verify/
после нажатия кнопки "проверить" ошибка вот такая:

Подпись не действительна
Не удалось проверить подпись формата CMS. Ошибка: [Указан неправильный алгоритм]. Код: [0x80090008]. Не удалось извлечь время подписи из атрибута signingTime. В подписи с индексом [0] не найдены подписанные атрибуты.

Формат подписи CAdES Подпись в формате PKCS7
и далее
информация уже о сертификате, там правильные данные.

явно что то не так, нужно было наверное подставить что то вроде GOST3410_2012_256 , (взято отсюда ) но на этом
Код:

 Signature.getInstance("GOST3410_2012_256", "JCP");

программа падает
java.security.NoSuchAlgorithmException: no such algorithm: GOST3410_2012_256 for provider JCP
at sun.security.jca.GetInstance.getService(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at java.security.Signature.getInstance(Unknown Source)

...
все осложняется тем, что jcp установлен на другой машине, с сертификатами, и отладиться очень сложно,

1) куда копать? подпись то ставится но какая то не полная. видно кому и кем выдан сертификат в подписи, однако проверка выдает ошибку
Подпись не действительна
Не удалось проверить подпись формата CMS. Ошибка: [Указан неправильный алгоритм]. Код: [0x80090008]. Не удалось извлечь время подписи из атрибута signingTime. В подписи с индексом [0] не найдены подписанные атрибуты.

есть пример нормальной подписи - так вот она определяется без этой ошибки, т.е. это я что то не так делаю.

2) вообще можно так делать, как я ? т.е:
Код:

import static com.sign2.CMS_samples.CMS.createCMS;

и потом из своего класса:
Код:

byte[] b = createCMS(a, signature.sign(), certificate, false);

как я привел пример выше, или нужно переписывать полностью пример из CMS.java или в моем случае нужно брать пример из какого то иного файла? Если да, то из какого?
3) и даже в таком случае, почему падает на строке Signature.getInstance("GOST3410_2012_256", "JCP");
с ошибкой java.security.NoSuchAlgorithmException: no such algorithm: GOST3410_2012_256 for provider JCP
это то ведь вообще должно работать....
версия jcp 2.0.39014

Отредактировано пользователем 14 ноября 2020 г. 15:18:45(UTC)  | Причина: упорядочил вопросы, и поздоровался

Offline Alexey2020  
#2 Оставлено : 16 ноября 2020 г. 9:35:47(UTC)
Alexey2020

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

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

Сказал(а) «Спасибо»: 1 раз
Доброе утро сам виноват - не внимательно смотрел примеры, плюс строка подписывалась модифицированная, а не исходная.
Переписал на выходных исходя из примеров - работает хорошо, однако, осталось одно замечание

с отсутствием подписанных атрибутов (нет метки времени).

. Не удалось извлечь время подписи из атрибута signingTime. В подписи с индексом [0] не найдены подписанные атрибуты.
С чем это может быть связано?

Отредактировано пользователем 16 ноября 2020 г. 9:36:38(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#3 Оставлено : 16 ноября 2020 г. 11:09:36(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 715 раз в 675 постах
Здравствуйте.
Скорее всего, подписанного signingTime просто нет среди атрибутов.
Как он добавляется, можно посмотреть в ф. hashSignCMSEx в классе CMSSign:
Код:

...
// signedAttributes
final int kmax = ...;
cms.signerInfos.elements[i + infos.length].signedAttrs = new SignedAttributes(kmax);
...
cms.signerInfos.elements[i + infos.length].signedAttrs.elements[k] = new Attribute(new OID(CMStools.STR_CMS_OID_SIGN_TYM_ATTR).value, new Attribute_values(1));

final Time time = new Time();
final Asn1UTCTime UTCTime = new Asn1UTCTime();
        
// текущая дата с календаря
UTCTime.setTime(Calendar.getInstance());
time.set_utcTime(UTCTime);
cms.signerInfos.elements[i + infos.length].signedAttrs.elements[k].values.elements[0] = time.getElement();
...
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Alexey2020 оставлено 18.11.2020(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.