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

Уведомление

Icon
Error

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

Статус: Участник

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

Сказал(а) «Спасибо»: 4 раз
Добрый день,

возникла необходимость подписать данные с помощью JCP (Java 11.0.7 и JCP 2.0.40450-A на Windows 10).

Алгоритм подписания:
Код:

		Security.addProvider(new JCP());
		Security.addProvider(new RevCheck());
		
		KeyStore keyStore=KeyStore.getInstance("RutokenStore");
		keyStore.load(null, null);
		String pin = "12345678";

		String alias = "tttt";
		
		PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, pin.toCharArray());		
		java.security.cert.Certificate[] chainArray = keyStore.getCertificateChain(alias);
		List<X509Certificate> chain =  Stream.of(chainArray).map(it -> (X509Certificate) it).collect(Collectors.toList());
		System.setProperty("com.sun.security.enableCRLDP", "true");
		System.setProperty("com.ibm.security.enableCRLDP", "true");
		System.setProperty("com.sun.security.enableAIAcaIssuers", "true");
		
		CAdESSignature cadesSignature = new CAdESSignature(false);
		cadesSignature.addSigner(JCP.PROVIDER_NAME, JCP.GOST_DIGEST_2012_256_OID,
				JCP.GOST_PARAMS_EXC_2012_256_KEY_OID, privateKey, Collections.singletonList(sert), CAdESType.CAdES_BES, null, false);
		
		ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
		cadesSignature.open(signatureStream);
		
		byte[] data = FileUtils.readFileToByteArray(new File(args[0]));
		
		cadesSignature.update(data);
		cadesSignature.close(); 
		signatureStream.close();
		
		byte[] cadesCms = signatureStream.toByteArray();
		
		FileUtils.writeByteArrayToFile(new File(args[1]), cadesCms);


в полученной подписи отсутствуют данные о подписанте. Руководство программиста по JCP и сэмплы смотрели, там только такой пример и CAdES-X Long Type 1. Что нужно добавить? Возможно нужно вручную устанавливать SignedAttributes?
Заранее спасибо
Offline Евгений Афанасьев  
#2 Оставлено : 30 сентября 2020 г. 20:34:33(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Здравствуйте.
Данные о подписанте присутствуют в подписанном атрибуте signing-certificateV2. Вы, видимо, имеете в виду сертификат. У одной из версий функции addSigner есть последний параметр boolean addCertificateChain для включения в подпись цепочки сертификатов.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
НаталияНаталия оставлено 01.10.2020(UTC)
Offline НаталияНаталия  
#3 Оставлено : 30 сентября 2020 г. 21:10:37(UTC)
НаталияНаталия

Статус: Участник

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

Сказал(а) «Спасибо»: 4 раз
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
Данные о подписанте присутствуют в подписанном атрибуте signing-certificateV2. Вы, видимо, имеете в виду сертификат. У одной из версий функции addSigner есть последний параметр boolean addCertificateChain для включения в подпись цепочки сертификатов.


Здравствуйте. Большое спасибо за ответ.
Проверили, действительно средства криптозащиты валидируют подпись как ошибочную, если на компьютере не установлен сертификат, которым использовался для подписания подписи. Теперь никак не получается решить вопрос о включении сертификата в подпись, т.к. во всех вариациях
Код:
ru.CryptoPro.CAdES.cl_1.addSigner(String, String, String, PrivateKey, List, Integer, String, boolean)
только один параметр boolean - "countersignature - True, если подпись заверяющая".

Отредактировано пользователем 30 сентября 2020 г. 22:14:56(UTC)  | Причина: Не указана

Offline НаталияНаталия  
#4 Оставлено : 30 сентября 2020 г. 22:23:03(UTC)
НаталияНаталия

Статус: Участник

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

Сказал(а) «Спасибо»: 4 раз
Автор: НаталияНаталия Перейти к цитате
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
Данные о подписанте присутствуют в подписанном атрибуте signing-certificateV2. Вы, видимо, имеете в виду сертификат. У одной из версий функции addSigner есть последний параметр boolean addCertificateChain для включения в подпись цепочки сертификатов.


Здравствуйте. Большое спасибо за ответ.
Проверили, действительно средства криптозащиты валидируют подпись как ошибочную, если на компьютере не установлен сертификат, которым использовался для подписания подписи. Теперь никак не получается решить вопрос о включении сертификата в подпись, т.к. во всех вариациях
Код:
ru.CryptoPro.CAdES.cl_1.addSigner(String, String, String, PrivateKey, List, Integer, String, boolean)
только один параметр boolean - "countersignature - True, если подпись заверяющая".



Ответ нашелся здесь на форуме:
Код:
final Collection<X509CertificateHolder> signingCertHolderCollection =
Collections.singletonList(new X509CertificateHolder(sert.getEncoded())); // signingCertificate - сертификат подписи

final CollectionStore signingCertificateCollection = 
	new CollectionStore(signingCertHolderCollection);
		
cadesSignature.setCertificateStore(signingCertificateCollection);


Спасибо огромное за помощь!
Offline Евгений Афанасьев  
#5 Оставлено : 1 октября 2020 г. 9:06:40(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Используемый вами вариант тоже подходит, он добавляет любые сертификаты в подпись.
В этих версиях появилась расширенная версия addSigner:
Цитата:

2019-07-08 КриптоПро JCP 2.0.40424, Java CSP 5.0.40424, Android CSP 5.0.40424
2019-07-08 КриптоПро JCP 2.0.40363-A, Java CSP 5.0.40363-A
* cades: реализована возможность добавить всю цепочку сертификатов подписанта в подпись (JCP-1250)

Если у вас JCP 2.0.40450-A, странно, что метод не найден. Действительно 40450-A? Методы лучше смотреть в javadoc/CAdES-javadoc.jar:
Цитата:

void addSigner(java.lang.String provider,
java.lang.String digestAlgorithm,
java.lang.String encryptionAlgorithm,
java.security.PrivateKey privateKey,
java.util.List<java.security.cert.X509Certificate> chain,
java.lang.Integer signatureType,
java.lang.String tsaUrl,
boolean countersignature,
org.bouncycastle.asn1.cms.AttributeTable signedAttributes,
org.bouncycastle.asn1.cms.AttributeTable unsignedAttributes,
java.util.Set<java.security.cert.X509CRL> cRLs,
boolean addCertificateChain)
throws CAdESException

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

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
НаталияНаталия оставлено 01.10.2020(UTC)
Offline НаталияНаталия  
#6 Оставлено : 1 октября 2020 г. 14:20:43(UTC)
НаталияНаталия

Статус: Участник

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

Сказал(а) «Спасибо»: 4 раз
Автор: Евгений Афанасьев Перейти к цитате
Используемый вами вариант тоже подходит, он добавляет любые сертификаты в подпись.
В этих версиях появилась расширенная версия addSigner:
Цитата:

2019-07-08 КриптоПро JCP 2.0.40424, Java CSP 5.0.40424, Android CSP 5.0.40424
2019-07-08 КриптоПро JCP 2.0.40363-A, Java CSP 5.0.40363-A
* cades: реализована возможность добавить всю цепочку сертификатов подписанта в подпись (JCP-1250)

Если у вас JCP 2.0.40450-A, странно, что метод не найден. Действительно 40450-A? Методы лучше смотреть в javadoc/CAdES-javadoc.jar:
Цитата:

void addSigner(java.lang.String provider,
java.lang.String digestAlgorithm,
java.lang.String encryptionAlgorithm,
java.security.PrivateKey privateKey,
java.util.List<java.security.cert.X509Certificate> chain,
java.lang.Integer signatureType,
java.lang.String tsaUrl,
boolean countersignature,
org.bouncycastle.asn1.cms.AttributeTable signedAttributes,
org.bouncycastle.asn1.cms.AttributeTable unsignedAttributes,
java.util.Set<java.security.cert.X509CRL> cRLs,
boolean addCertificateChain)
throws CAdESException


Спасибо что поправили, действительно была путаница с класспасом в IDE и тащились джарки от 2.0.40035, на которые наложился джавадок из 40450-A. С таким методом тоже все работает отлично.
Еще раз спасибо.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.