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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline U3962  
#1 Оставлено : 23 марта 2017 г. 13:36:25(UTC)
U3962

Статус: Активный участник

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

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 2 раз в 2 постах
Добрый день.
Требуется подписать файл следующим образом:

– подписанный одной или несколькими усиленными квалифицированными электронными подписями должностных лиц в формате PKCS#7 (отделенная электронная подпись);

– содержащий метку времени (для электронного документа, подписанного усиленной квалифицированной электронной подписью), наложенную в соответствии со спецификацией Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP) и со спецификацией CAdES-T (ETSI TS 101 733 «CMS Advanced Electronic Signatures (CadES)».

Используем jcp.1.0.54 и jre1.7.0_21
Машина где все происходит работает под Windows serwer 2012, имеет ограниченный доступ в Интернет.
В примерах есть файл jcp.1.0.54\Samples\samples-sources\CAdES\SignExample.java
Следуя примеру пытаемся создать подпись CadES:
Код:
byte[] DATA = Array.readFile("C:\\_localsoft\\FSSP_FILES\\answers\\arc\\res_13484630806.xml");
		Collection<X509Certificate> chain = new ArrayList<X509Certificate>();
		PrivateKey privateKey = Configuration.loadConfiguration(chain);
		CAdESSignature cadesSignature = new CAdESSignature(false);
		// Создаем подписанта CAdES-BES.
		cadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_BES, null);
		// Завершаем создание подписи с двумя подписантами.
		byte[] cadesCms = cadesSignature.sign(DATA);
		Array.writeFile("123.SIG", cadesCms);


При запуске получаем ошибку:

Код:
Mar 23, 2017 4:27:53 PM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 1.0.54 36641
Mar 23, 2017 4:27:53 PM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
Mar 23, 2017 4:27:54 PM ru.CryptoPro.CAdES.tools.Utility initJCPAlgorithms
INFO: Replacement of BouncyCastle GOST algorithms.
Mar 23, 2017 4:27:54 PM ru.CryptoPro.CAdES.CAdESSignature addSigner
INFO: Add signer certificate
	serial number: 1d217c04460a5f00000007800060002
	subject: CN=АО БАНК «СНГБ», OU=0, O=АО БАНК «СНГБ», ST=86 Ханты-Мансийский автономный округ – Югра, L=Сургут, C=RU, STREET="ул. Григория Кукуевицкого, д. 19", OID.1.2.643.3.131.1.1=#120C303038363032313930323538, OID.1.2.643.100.1=#120D31303238363030303031373932
	issuer: CN=УЦ ИИТ (К3), O="ОАО \"ИнфоТеКС Интернет Траст\"", EMAILADDRESS=SupportIIT@infotecs.ru, ST=77 г. Москва, L=Москва, C=RU, OID.1.2.643.3.131.1.1=#120C303037373433303230353630, OID.1.2.643.100.1=#120D31303237373339313133303439, STREET="Старый Петровско-Разумовский проезд, д. 1/23, стр. 1"
Mar 23, 2017 4:27:54 PM ru.CryptoPro.CAdES.b.d.a <clinit>
INFO: %%% Loading C:\_localsoft\SMEV_3_0_CLIENT\jre1.7.0_21\lib\security\cacerts %%%
Mar 23, 2017 4:27:54 PM ru.CryptoPro.CAdES.b.d.a <clinit>
INFO: %%% Trusted store loaded %%%
Mar 23, 2017 4:27:54 PM ru.CryptoPro.CAdES.exception.CAdESException <init>
SEVERE: Error building certification path for CN=АО БАНК «СНГБ», OU=0, O=АО БАНК «СНГБ», ST=86 Ханты-Мансийский автономный округ – Югра, L=Сургут, C=RU, STREET="ул. Григория Кукуевицкого, д. 19", OID.1.2.643.3.131.1.1=#120C303038363032313930323538, OID.1.2.643.100.1=#120D31303238363030303031373932: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Exception in thread "main" Error building certification path for CN=АО БАНК «СНГБ», OU=0, O=АО БАНК «СНГБ», ST=86 Ханты-Мансийский автономный округ – Югра, L=Сургут, C=RU, STREET="ул. Григория Кукуевицкого, д. 19", OID.1.2.643.3.131.1.1=#120C303038363032313930323538, OID.1.2.643.100.1=#120D31303238363030303031373932: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target, errors: 'PKIX failure: invalid certificate parameters' (33)
	at ru.CryptoPro.CAdES.b.d.b.a(Unknown Source)
	at ru.CryptoPro.CAdES.b.d.b.a(Unknown Source)
	at ru.CryptoPro.CAdES.b.d.a.a(Unknown Source)
	at ru.CryptoPro.CAdES.CAdESSignature.addSigner(Unknown Source)
	at ru.CryptoPro.CAdES.CAdESSignature.addSigner(Unknown Source)
	at run.main(run.java:64)


Включено логирование:
Код:
ru.CryptoPro.JCP.tools.JCPLogger.level = FINE
ru.CryptoPro.JCP.tools.JCPLogger.handlers = java.util.logging.FileHandler

Лог-файл во вложении java0.zip (6kb) загружен 4 раз(а)..

Вопросы:
1. Каким образом можно формировать отсоединенные подписи CAdES-T используя jcp.1.0.54 ?
2. По какой причине в нашем случае не работает пример подписи jcp.1.0.54\Samples\samples-sources\CAdES\SignExample.java ?
3. Что за ошибка "unable to find valid certification path to requested target, errors: 'PKIX failure: invalid certificate parameters' (33)
" ?

Буду признателен за любую помощь.

Отредактировано пользователем 31 марта 2017 г. 10:41:49(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 23 марта 2017 г. 13:48:56(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Автор: U3962 Перейти к цитате
1. Каким образом можно формировать отсоединенные подписи CAdES-T используя jcp.1.0.54 ?
2. По какой причине в нашем случае не работает пример подписи jcp.1.0.54\Samples\samples-sources\CAdES\SignExample.java ?
3. Что за ошибка "unable to find valid certification path to requested target, errors: 'PKIX failure: invalid certificate parameters' (33)
" ?

1. В jcp 1.0.54 подпись такого формата не сформировать. Вы можете создать CAdES-BES, потом самостоятельно добавить в неподписанные атрибуты штамп времени. Или использовать jcp 2.0.
2-3. Корневой сертификат добавили в <jre>/lib/security/cacerts? Подаете промежуточные сертификаты (если есть) вместе с сертификатом подписи в addSigner?

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
U3962 оставлено 24.03.2017(UTC)
Offline U3962  
#3 Оставлено : 24 марта 2017 г. 8:28:35(UTC)
U3962

Статус: Активный участник

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

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 2 раз в 2 постах
Автор: afev Перейти к цитате
Здравствуйте.
Автор: U3962 Перейти к цитате
1. Каким образом можно формировать отсоединенные подписи CAdES-T используя jcp.1.0.54 ?
2. По какой причине в нашем случае не работает пример подписи jcp.1.0.54\Samples\samples-sources\CAdES\SignExample.java ?
3. Что за ошибка "unable to find valid certification path to requested target, errors: 'PKIX failure: invalid certificate parameters' (33)
" ?

1. В jcp 1.0.54 подпись такого формата не сформировать. Вы можете создать CAdES-BES, потом самостоятельно добавить в неподписанные атрибуты штамп времени. Или использовать jcp 2.0.
2-3. Корневой сертификат добавили в <jre>/lib/security/cacerts? Подаете промежуточные сертификаты (если есть) вместе с сертификатом подписи в addSigner?



Добрый день.
Благодарю за быстрый ответ.

Перевели сервис на jcp 2.0.
Подскажите (в какой пример посмотреть ) как сформировать CAdES-T на jcp 2.0 ?
Offline Евгений Афанасьев  
#4 Оставлено : 24 марта 2017 г. 9:37:36(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Посмотрите документацию CAdES-javadoc.jar в папке javadoc дистрибутива, там есть примеры. Примеры есть и в samples-sourcers.jar в папке CAdES. Тип подписи - CAdES_T. Потребуется указать адрес TSP службы и добавить корневой сертификат службы в <jre>/lib/security/cacerts (как и корневой сертификат клиентской цепочки).
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
U3962 оставлено 24.03.2017(UTC)
Offline U3962  
#5 Оставлено : 24 марта 2017 г. 9:44:18(UTC)
U3962

Статус: Активный участник

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

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 2 раз в 2 постах
Автор: afev Перейти к цитате
Посмотрите документацию CAdES-javadoc.jar в папке javadoc дистрибутива, там есть примеры. Примеры есть и в samples-sourcers.jar в папке CAdES. Тип подписи - CAdES_T. Потребуется указать адрес TSP службы и добавить корневой сертификат службы в <jre>/lib/security/cacerts (как и корневой сертификат клиентской цепочки).


Добрый день.
Корневые сертификаты добавлены в <jre>/lib/security/cacerts следующими командами:
keytool -keystore C:/_localsoft/jre/lib/security/cacerts -importcert -alias mainroot -file ./root.cer
keytool -keystore C:/_localsoft/jre/lib/security/cacerts -importcert -alias mainroot2 -file ./CII.cer

Пробую подписать файл:
Код:
//онлайн проверка сертификатов
System.setProperty("ru.CryptoPro.reprov.enableCRLDP", "true");
System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");
String cer_story = "HDImageStore";
String cer_alias = "gis-smev-2016-2017";
String cer_pass_str = "pass123";
char[] cer_pass = cer_pass_str.toCharArray();

KeyStore keyStore = KeyStore.getInstance( cer_story );
keyStore.load( null, null );
PrivateKey privateKey = (PrivateKey) keyStore.getKey( cer_alias, cer_pass );
X509Certificate cert = (X509Certificate) keyStore.getCertificate( cer_alias );
List<X509Certificate> chain = Arrays.asList( cert );
//файл для подписи res_13504107761.xml
byte[] src = Files.readAllBytes(Paths.get("C:\\_localsoft\\FSSP_FILES\\answers\\arc\\res_13504107761.xml"));
//отсоединенная подпись
CAdESSignature cadesSignature = new CAdESSignature( true );
// Создаем подписанта CAdES-BES.
cadesSignature.addSigner( "JCP", getDigestOid(privateKey),getPublicKeyOid(privateKey),privateKey, chain, CAdESType.CAdES_BES, null, false );  
// Будущая подпись в виде массива.
ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
// Подготовка контекста.
cadesSignature.open( signatureStream );
// Хеширование.
cadesSignature.update( src );
// Создание подписи с выводом в signatureStream.
cadesSignature.close();
signatureStream.close();
// Получаем подпись в виде массива.
byte[] cadesCms = signatureStream.toByteArray();
//сохранить подпись в файл
FileOutputStream out = new FileOutputStream("res_13504107761.xml.sig");
out.write(cadesCms);
out.close();


во вложении файл и его подпись ( signs.rar (3kb) загружен 3 раз(а).)
При проверке подписи на сайте https://www.gosuslugi.ru/pgu/eds/
Пункт "электронного документа. ЭП — отсоединенная, в формате PKCS#7"
Получаю ошибку: Не найден сертификат подписи
Что некорректно в формировании подписи? И как сделать подпись CAdES_T

Отредактировано пользователем 24 марта 2017 г. 12:55:52(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#6 Оставлено : 24 марта 2017 г. 14:02:36(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
По умолчанию сертификат или цепочка в подпись не помещаются, кроме x long type 1; посмотрите в доке методы класса CadesSignature или параметры в ф. addSigner, которые позволят добавить.
В addSigner можно указать тип подписи Cades_t и адрес tsp службы.

Отредактировано пользователем 24 марта 2017 г. 14:04:02(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
U3962 оставлено 24.03.2017(UTC)
Offline U3962  
#7 Оставлено : 24 марта 2017 г. 14:25:03(UTC)
U3962

Статус: Активный участник

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

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 2 раз в 2 постах
Автор: afev Перейти к цитате
По умолчанию сертификат или цепочка в подпись не помещаются, кроме x long type 1; посмотрите в доке методы класса CadesSignature или параметры в ф. addSigner, которые позволят добавить.
В addSigner можно указать тип подписи Cades_t и адрес tsp службы.


Добрый день.
С сертификатами разобрался.
Помог пример с форума:
Код:
Collection<X509Certificate> chain = new ArrayList<X509Certificate>(); // список сертификатов
Collection<X509CertificateHolder> holderList = new ArrayList<X509CertificateHolder>();
...

for (X509Certificate cert : chain) {
    holderList.add(new X509CertificateHolder(cert.getEncoded()));
} // for

...
cadesSignature.[h]setCertificateStore[/h](new CollectionStore(holderList));


Подпись проходит проверку на портале госуслуг, но она не CADES_T...


1. В addSigner можно указать тип подписи Cades_t:
Выбор не позволяет указать Cades_t: CADEST.png (19kb) загружен 70 раз(а).
Библиотека CAdES.jar во вложении ( cades.rar (127kb) загружен 5 раз(а).) (jcp-2.0.38150)

2.адрес tsp службы указываю http://www.cryptopro.ru:80/tsp/
При запуске получаю ошибку (тип подписи указываю CAdES_X_Long_Type_1 для теста доступа к службе):

Код:
Mar 24, 2017 4:26:40 PM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 2.0 38150
Mar 24, 2017 4:26:40 PM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
Mar 24, 2017 4:26:40 PM ru.CryptoPro.CAdES.tools.Utility initJCPAlgorithms
INFO: Replacement of BouncyCastle GOST algorithms.
Mar 24, 2017 4:26:42 PM ru.CryptoPro.CAdES.exception.CAdESException <init>
SEVERE: Error building certification path for EMAILADDRESS=support@cryptopro.ru, C=RU, ST=77 г. Москва, L=Москва, STREET="ул. Сущёвский вал, д. 18", OID.1.2.643.100.1=#120D31303037373132333435363738, O="ООО \"КРИПТО-ПРО\"", OU=Тестовый УЦ, CN="Тестовая служба штампов времени ООО \"КРИПТО-ПРО\"", OID.1.2.643.3.131.1.1=#120C303037373132333435363738: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target
Exception in thread "main" org.bouncycastle.cms.CMSAttributeTableGenerationException: Error building certification path for EMAILADDRESS=support@cryptopro.ru, C=RU, ST=77 г. Москва, L=Москва, STREET="ул. Сущёвский вал, д. 18", OID.1.2.643.100.1=#120D31303037373132333435363738, O="ООО \"КРИПТО-ПРО\"", OU=Тестовый УЦ, CN="Тестовая служба штампов времени ООО \"КРИПТО-ПРО\"", OID.1.2.643.3.131.1.1=#120C303037373132333435363738: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target
	at ru.CryptoPro.CAdES.d.c.a.getAttributes(Unknown Source)
	at ru.CryptoPro.CAdES.d.c.d.getAttributes(Unknown Source)
	at ru.CryptoPro.CAdES.d.c.b.getAttributes(Unknown Source)
	at org.bouncycastle.cms.CMSSignedDataStreamGenerator$SignerIntInfoGeneratorImpl.generate(Unknown Source)
	at org.bouncycastle.cms.CMSSignedDataStreamGenerator$CmsSignedDataOutputStream.close(Unknown Source)
	at ru.CryptoPro.CAdES.CAdESSignature.close(Unknown Source)
	at digest.run.main(run.java:142)
Caused by: Error building certification path for EMAILADDRESS=support@cryptopro.ru, C=RU, ST=77 г. Москва, L=Москва, STREET="ул. Сущёвский вал, д. 18", OID.1.2.643.100.1=#120D31303037373132333435363738, O="ООО \"КРИПТО-ПРО\"", OU=Тестовый УЦ, CN="Тестовая служба штампов времени ООО \"КРИПТО-ПРО\"", OID.1.2.643.3.131.1.1=#120C303037373132333435363738: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target, errors: 'PKIX failure: invalid parameters of certificate' (33)
	at ru.CryptoPro.CAdES.e.a.a.a(Unknown Source)
	at ru.CryptoPro.CAdES.e.a.a.a(Unknown Source)
	at ru.CryptoPro.CAdES.e.a.b.a(Unknown Source)
	at ru.CryptoPro.CAdES.CAdESSigner.a(Unknown Source)
	at ru.CryptoPro.CAdES.CAdESSignature.a(Unknown Source)
	at ru.CryptoPro.CAdES.g.a.a(Unknown Source)
	at ru.CryptoPro.CAdES.d.a.d.a(Unknown Source)
	at ru.CryptoPro.CAdES.d.c.a.a(Unknown Source)
	... 7 more


Возможно это связано с тем, что корневой сертификат службы отпечатков времени не прописан в <jre>/lib/security/cacerts
Где взять актуальный корневой сертификат этой службы?

Отредактировано пользователем 24 марта 2017 г. 15:43:39(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#8 Оставлено : 25 марта 2017 г. 16:58:24(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Автор: U3962 Перейти к цитате
Возможно это связано с тем, что корневой сертификат службы отпечатков времени не прописан в &lt;jre&gt;/lib/security/cacerts
Где взять актуальный корневой сертификат этой службы?

Да, верно, не строится цепочка для tsp службы, т.к. нет корневого в cacerts.
Где-то на форуме была ссылка для скачивания корневого для службы.
CAdES-T появилась где-то в более поздних дистрибутивах, посмотрите в последнем.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
U3962 оставлено 27.03.2017(UTC)
Offline U3962  
#9 Оставлено : 27 марта 2017 г. 14:29:49(UTC)
U3962

Статус: Активный участник

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

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 2 раз в 2 постах
Автор: afev Перейти к цитате
Автор: U3962 Перейти к цитате
Возможно это связано с тем, что корневой сертификат службы отпечатков времени не прописан в &lt;jre&gt;/lib/security/cacerts
Где взять актуальный корневой сертификат этой службы?

Да, верно, не строится цепочка для tsp службы, т.к. нет корневого в cacerts.
Где-то на форуме была ссылка для скачивания корневого для службы.
CAdES-T появилась где-то в более поздних дистрибутивах, посмотрите в последнем.

Добрый день.
Обновил JCP до 2.0.39014
CAdESType.CAdES_T теперь доступен.
Нашел на сайте криптопро: https://www.cryptopro.ru/products/pki/tsp/test
адрес сервера штампов: http://www.cryptopro.ru/tsp/
сертификат:http://www.cryptopro.ru/sites/default/files/products/tsp/tsa.cer
сертификат УЦ:https://www.cryptopro.ru/ra/cdp/cacer3.crt

и cacer3.crt и tsa.cer регистрирую в &lt;jre&gt;/lib/security/cacerts

Создаю CADES_T (полный пример:)
Код:

import ru.CryptoPro.JCP.Digest.AbstractGostDigest;
import ru.CryptoPro.JCP.Digest.GostDigest;
import ru.CryptoPro.JCP.JCP;
import ru.CryptoPro.JCP.params.OID;
import java.io.*;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.security.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.*;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.util.CollectionStore;
import ru.CryptoPro.CAdES.CAdESSignature;
import ru.CryptoPro.CAdES.CAdESSigner;
import ru.CryptoPro.CAdES.CAdESType;
import ru.CryptoPro.CAdES.exception.*;

import java.nio.file.Files;
import java.nio.file.Paths;
class ProxyAuthenticator extends Authenticator {

    private String user, password;

    public ProxyAuthenticator(String user, String password) {
        this.user = user;
        this.password = password;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, password.toCharArray());
    }
}

public class run {
	public static String getPublicKeyOid(PrivateKey privateKey) {

        String privateKeyAlgorithm = privateKey.getAlgorithm();

        if (privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_EL_2012_256_NAME) ||
            privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_DH_2012_256_NAME)) {
            return JCP.GOST_PARAMS_SIG_2012_256_KEY_OID;
        } // if
        else if (privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_EL_2012_512_NAME) ||
            privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_DH_2012_512_NAME)) {
            return JCP.GOST_PARAMS_SIG_2012_512_KEY_OID;
        } // if

        return JCP.GOST_EL_KEY_OID;

    }
	
	 public static String getDigestOid(PrivateKey privateKey) {

	        String privateKeyAlgorithm = privateKey.getAlgorithm();

	        if (privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_EL_2012_256_NAME) ||
	            privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_DH_2012_256_NAME)) {
	            return JCP.GOST_DIGEST_2012_256_OID;
	        } // if
	        else if (privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_EL_2012_512_NAME) ||
	            privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_DH_2012_512_NAME)) {
	            return JCP.GOST_DIGEST_2012_512_OID;
	        } // if

	        return JCP.GOST_DIGEST_OID;
	    }
	 
	 
	public static String toHexString(byte[] array) {
	    final char[] hex = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
	            'B', 'C', 'D', 'E', 'F'};
	    StringBuffer ss = new StringBuffer(array.length * 3);
	    for (int i = 0; i < array.length; i++) {
	        ss.append(' ');
	        ss.append(hex[(array[i] >>> 4) & 0xf]);
	        ss.append(hex[array[i] & 0xf]);
	    }
	    return ss.toString();
	}
	public static void main(String[] args) throws NoSuchAlgorithmException, IOException, KeyStoreException, CertificateException, UnrecoverableKeyException, CAdESException {
		//proxy if need
		Authenticator.setDefault(new ProxyAuthenticator("user", "pass"));
		System.setProperty("http.proxyHost", "proxy.xxx.local");
		System.setProperty("http.proxyPort", "3128");
		//proxy if need
		
		//System.setProperty("ru.CryptoPro.reprov.enableCRLDP", "true");
        System.setProperty("com.sun.security.enableCRLDP", "true");
        System.setProperty("com.ibm.security.enableCRLDP", "true");
		String cer_story = "HDImageStore";
	    String cer_alias = "certname";
	    String cer_pass_str = "pass";
	    char[] cer_pass = cer_pass_str.toCharArray();
	    
	    KeyStore keyStore = KeyStore.getInstance( cer_story );
        keyStore.load( null, null );
        PrivateKey privateKey = (PrivateKey) keyStore.getKey( cer_alias, cer_pass );
        
        X509Certificate cert = (X509Certificate) keyStore.getCertificate( cer_alias );
        List<X509Certificate> chain = Arrays.asList( cert );
        //new sign
        CAdESSignature cadesSignature = new CAdESSignature( true );
        //add certs in sign
        Collection<X509CertificateHolder> holderList = new ArrayList<X509CertificateHolder>();
        for (X509Certificate cert1 : chain) 
        {
            holderList.add(new X509CertificateHolder(cert1.getEncoded()));
        } 
        cadesSignature.setCertificateStore(new CollectionStore(holderList));
        //add certs in sign
  
        //data to sign
        byte[] src = Files.readAllBytes(Paths.get("C:\\_localsoft\\FSSP_FILES\\answers\\arc\\res_13504107761.xml"));
  
        // Создаем подписанта CAdES-BES.
        cadesSignature.addSigner( "JCP", getDigestOid(privateKey),getPublicKeyOid(privateKey),privateKey, chain, CAdESType.CAdES_T, "http://www.cryptopro.ru/tsp/", false );  
        
        // Будущая подпись в виде массива.
        ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
        // Подготовка контекста.
        cadesSignature.open( signatureStream );
        // Хеширование.
        cadesSignature.update( src );
       
        // Создание подписи с выводом в signatureStream.
        cadesSignature.close();
        signatureStream.close();
        // Получаем подпись в виде массива.
        byte[] cadesCms = signatureStream.toByteArray();

        FileOutputStream out = new FileOutputStream("res_13504107761.xml.sig");
		out.write(cadesCms);
		out.close();
		System.out.println("END");
	}
}



Все получилось.
В архиве файл и его отсоединенная CADES_T подпись.
signs.rar (5kb) загружен 28 раз(а).
На сайте https://www.gosuslugi.ru/pgu/eds/ валидация проходит нормально.
Посмотрим как примут документы.

Отредактировано пользователем 27 марта 2017 г. 14:58:27(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил U3962 за этот пост.
Малыгин Н. оставлено 05.10.2018(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.