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

Уведомление

Icon
Error

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

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

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

Сказал(а) «Спасибо»: 10 раз
Поблагодарили: 3 раз в 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)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Автор: 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)
Сообщений: 46
Российская Федерация
Откуда: Сургут

Сказал(а) «Спасибо»: 10 раз
Поблагодарили: 3 раз в 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)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Посмотрите документацию 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)
Сообщений: 46
Российская Федерация
Откуда: Сургут

Сказал(а) «Спасибо»: 10 раз
Поблагодарили: 3 раз в 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) загружен 4 раз(а).)
При проверке подписи на сайте 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)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
По умолчанию сертификат или цепочка в подпись не помещаются, кроме 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)
Сообщений: 46
Российская Федерация
Откуда: Сургут

Сказал(а) «Спасибо»: 10 раз
Поблагодарили: 3 раз в 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) загружен 71 раз(а).
Библиотека CAdES.jar во вложении ( cades.rar (127kb) загружен 6 раз(а).) (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)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Автор: 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)
Сообщений: 46
Российская Федерация
Откуда: Сургут

Сказал(а) «Спасибо»: 10 раз
Поблагодарили: 3 раз в 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) загружен 31 раз(а).
На сайте https://www.gosuslugi.ru/pgu/eds/ валидация проходит нормально.
Посмотрим как примут документы.

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

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