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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline AntonScript  
#1 Оставлено : 12 июля 2023 г. 17:51:32(UTC)
AntonScript

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

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

Сказал(а) «Спасибо»: 2 раз
Добрый день! Пытаюсь получить подпись сертификата и его проверку с помощью jcp, но застрял на этапе создания подписи, поэтому буду признателен за любую помощь (руководство и примеры смотрел, но особого результата не дало)
Что имеется:
1. Есть установленный контейнер с сертификатом "example_name" - команда: /opt/cprocsp/bin/amd64/certmgr -list, выводит его ссылка на ключ есть, код вывода: [ErrorCode: 0x00000000]
2. Для подписание файла используется команда: /opt/cprocsp/bin/amd64/cryptcp -signf -dir /user/sign -thumbprint 'value_123' -pin 'pin_123' -uMy -nochain -errchain /user/files/test.txt test.txt (1kb) загружен 3 раз(а). (файл прикреплен, там сломанная подпись, поменял часть символов, она как пример размера и формата подписи), в результате создается файл подписи: test.txt.sgn mock_test.txt.sgn (2kb) загружен 5 раз(а). (приложен сломанный файл, чтобы показать как выглядит формат подписи). Мета-информация о подписи: contentType ContentType OBJECT IDENTIFIER 1.2.840.113549.1.7.2 signedData (PKCS #7) , DigestAlgorithmIdentifier SEQUENCE (1 elem) algorithm OBJECT IDENTIFIER 1.2.643.7.1.1.2.2 gost2012Digest256 (GOST R 34.11-2012 256 bit digest) .
3. Для проверки подписи используется команда: /opt/cprocsp/bin/amd64/cryptcp -vsignf -dir /user/sign -thumbprint 'value_123' -uMy -nochain -errchain /user/files/test.txt . Вывод:
Цитата:
Будет использован следующий сертификат:
Субъект: ... описание моего сертификата

Папка '/user/files/':
/user/files/test.txt... Проверка подписи...
Автор подписи: ... описание моего сертификата
Подпись проверена.
[ErrorCode: 0x00000000]


Что сделано с помощью кода:
Цитата:
System.setProperty("file.encoding", "UTF-8");
Security.addProvider(new JCP());
Security.addProvider(new RevCheck());
Security.addProvider(new CryptoProvider());
KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME,
JCP.PROVIDER_NAME);
keyStore.load(null, null);
final PrivateKey signerPrivateKey =
(PrivateKey) keyStore.getKey(ALIAS, "password".toCharArray());
final X509Certificate signerCert = (X509Certificate) keyStore.getCertificate(ALIAS);


Как с помощью этого получить аналогичную подпись и проверить - вопрос.
Что пробовал сделать:
1. данный код формировал котороткую подпись, которая не проходила валиацию через терминал.
Цитата:
public static byte[] sign(String alghorithmName, PrivateKey privateKey,
byte[] data) throws Exception {

final Signature sig = Signature.getInstance(alghorithmName, JCP.PROVIDER_NAME);
sig.initSign(privateKey);
sig.update(data);
return sig.sign();
}

2. Создавал CAdESSignature, но там возникала ошибка:
Цитата:
Caused by: ru.CryptoPro.AdES.exception.AdESException: Error occurred during building the certification path for the target:
serial: 263a82cb3f2981381ed11cc08e7487bbb
subject:

Код(получение ключа и сертификата аналогично коду выше) :
Цитата:

final List<X509Certificate> signerCertificateChain = Collections.singletonList(signerCert);
final CAdESSignature cadesSignature = new CAdESSignature(false);
//здесь возникает ошибка
cadesSignature.addSigner(
JCP.PROVIDER_NAME, // Имя провайдера, который будет использоваться для создания подписи.
JCP.GOST_DIGEST_NAME, // Идентификатор алгоритма хэширования, который будет использоваться для вычисления дайджеста (хэша) подписываемых данных.
JCP.GOST_EL_SIGN_NAME, // Идентификатор алгоритма подписи, который будет использоваться для создания электронной подписи.
signerPrivateKey, // Приватный ключ подписанта.
signerCertificateChain, // Цепочка сертификатов подписанта.
CAdESType.CAdES_BES, // Тип CAdES подписи.
null, // Адрес TSA службы.
false, // Заверяющая ли подпись.
null, // Таблица подписанных аттрибутов для добавления в подпись.
null, // Таблица неподписанных аттрибутов для добавления в подпись.
null, // CRL (списков отзыва сертификатов), связанных с подписью.
false // Добавить ли цепочку подписанта в подпись.
);



3. Пытался просто проверить подпись, но там возникает ошибка: Caused by: ru.CryptoPro.CAdES.exception.CAdESException: Certificate: sn 263a82cb3f2981381ed11cc08e7487bbb issued by GeneralNames:
... описание моего сертификата
not found


код:
Цитата:
File file = new File("/user/files/test.txt");
File sign = new File("/user/sign/test.txt.sgn");
byte[] msg = FileUtils.readFileToByteArray(file);
byte[] bytes = Base64.decodeBase64(FileUtils.readFileToString(sign));
CAdESSignature cAdESSignature = new CAdESSignature(bytes, msg, null);
cAdESSignature.verify(null);



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

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Здравствуйте.

Как в п.1 проверить нельзя, т.к. это, судя по всему, CMS подпись на подписанные атрибуты, а Signature проверяет raw-подпись. Можно проверить с помощью CAdESSignature при условии, что корневой сертификат цепочки сертификата подписи установлен в cacerts. Или проверить с помощью низкоуровневых примеров вроде CMSVerify в пакете CMS_samples архива samples_sources.jar.

В п.2 CAdESSignature создаст похожую подпись, но нужен (А) установить корневой сертификат цепочки сертификата в cacerts и (Б) в addSigner указать "Добавить ли цепочку подписанта в подпись." = true или использовать вместо этого параметра setCertificateStore с передачей в него сертификата для добавления в подпись сертификата подписи. Или вместо CAdESSignature для создания использовать низкоуровневый пример вроде CMSSign в пакете CMS_samples архива samples_sources.jar.

"Error occurred during building the certification path for the target:" возникает из-за того, что не удается построить цепочку сертификатов: нет промежуточных, не установлен корневой.

п.3, возможно, возникает из-за того, что в подписи нет сертификата подписи. Если подпись создавалась в cryptcp, то там, наверно, можно указать, что требуется добавить сертификат в подпись.

Отредактировано пользователем 12 июля 2023 г. 19:15:48(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
AntonScript оставлено 12.07.2023(UTC)
Offline AntonScript  
#3 Оставлено : 13 июля 2023 г. 8:23:16(UTC)
AntonScript

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

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

Сказал(а) «Спасибо»: 2 раз
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.

Как в п.1 проверить нельзя, т.к. это, судя по всему, CMS подпись на подписанные атрибуты, а Signature проверяет raw-подпись. Можно проверить с помощью CAdESSignature при условии, что корневой сертификат цепочки сертификата подписи установлен в cacerts. Или проверить с помощью низкоуровневых примеров вроде CMSVerify в пакете CMS_samples архива samples_sources.jar.

В п.2 CAdESSignature создаст похожую подпись, но нужен (А) установить корневой сертификат цепочки сертификата в cacerts и (Б) в addSigner указать "Добавить ли цепочку подписанта в подпись." = true или использовать вместо этого параметра setCertificateStore с передачей в него сертификата для добавления в подпись сертификата подписи. Или вместо CAdESSignature для создания использовать низкоуровневый пример вроде CMSSign в пакете CMS_samples архива samples_sources.jar.

"Error occurred during building the certification path for the target:" возникает из-за того, что не удается построить цепочку сертификатов: нет промежуточных, не установлен корневой.

п.3, возможно, возникает из-за того, что в подписи нет сертификата подписи. Если подпись создавалась в cryptcp, то там, наверно, можно указать, что требуется добавить сертификат в подпись.


Спасибо за пояснение! Хочу уточнить, подскажите пожалуйста:
1.Если нет корневых сертификатов, то нужно использовать только CMSSign?
2. По п.3, а как так может быть что cryptcp создал подпись без сертификата и при этом может ее успешно проверять? Но судя по мета информации файла подписи, там есть поля с описание сертификата, тогда в чем еще может быть ошибка?
Offline Евгений Афанасьев  
#4 Оставлено : 13 июля 2023 г. 15:29:29(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
1. Рекомендуемый вариант - именно CAdESSignature. Другие варианты вроде CMSSign низкоуровневые и не рекомендуются, т.к. в ходе реализации можно допустить ошибку.
2. Возможно, ваш сертификат установлен в хранилище Личное и crypcp (CSP) там его находит по SigningCertificate, который в подписи.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
AntonScript оставлено 14.07.2023(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.