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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline CryptoSKB  
#1 Оставлено : 17 декабря 2018 г. 9:37:25(UTC)
CryptoSKB

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Всем привет!
Занимаюсь разработкой - появилась необходимость реализовать добавление ЭЦП (PKCS#7) на XML документ с помощью Java.
Решил попробовать примеры КриптоПРО - скачал пакет jcp-2.0.40035, собрал проект по инструкции Doc/README.jcp+xmldsigri.txt, но в итоге столкнулся с отсутствием необходимых тестов в скачанном проекте.
Судя по описанию должны быть тесты:

1) GenDetached.java - подпись генерируемого XML документа сгенерированным ключом (генерируется пара ключей).
2) GenDetachedByCert.java - подпись генерируемого XML документа клиентским ключом, сформированным раннее в панели ControlPane JCP.
3) Validate.java - проверка ЭЦП подписанного XML документа открытым ключом, имеющемся внутри.
4) ValidateByCert.java - проверка ЭЦП подписанного документа открытым ключом сертификата, находящимся внутри.

Фактически же есть только класс GenDetached.java

Подскажите, пожалуйста, может не в ту сторону копаю?
Нужно всего лишь реализовать добавить отсоединенную подпись PKCS#7 к исходному XML сообщению. Поизучал форум - ответов на свои вопросы не нашел.

Отредактировано пользователем 17 декабря 2018 г. 10:04:16(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил CryptoSKB за этот пост.
Just Lex оставлено 09.02.2021(UTC)
Offline Евгений Афанасьев  
#2 Оставлено : 17 декабря 2018 г. 11:19:11(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Фактически, функционал этих примеров перенесен в примеры SignFileExample, ValidateXMLSig пакета JCPxml.dsig.internal.xmldsigri.tests архива samples-sources.jar. Для создания подписи формата PKCS#7 нужно использовать примеры CMS, CMSSign, CMSVerify из пакета CMS_samples того же архива.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
CryptoSKB оставлено 20.12.2018(UTC)
Offline CryptoSKB  
#3 Оставлено : 20 декабря 2018 г. 16:58:42(UTC)
CryptoSKB

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
Фактически, функционал этих примеров перенесен в примеры SignFileExample, ValidateXMLSig пакета JCPxml.dsig.internal.xmldsigri.tests архива samples-sources.jar. Для создания подписи формата PKCS#7 нужно использовать примеры CMS, CMSSign, CMSVerify из пакета CMS_samples того же архива.


Спасибо, это здорово помогло продвинуться вперед! Удалось создать подпись формата PKCS#7 с помощью класса CMS.
Далее пытаюсь с помощью класса SignFileExample подписать XML документ с ее помощью, но натыкаюсь на ошибку:
Цитата:
log4j:WARN No appenders could be found for logger (org.apache.xml.security.Init).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.or...4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xml/security/exceptions/AlgorithmAlreadyRegisteredException
at ru.CryptoPro.JCPxml.xmldsig.JCPXMLDSigInit.init(Unknown Source)
at JCPxml.dsig.internal.xmldsigri.tests.SignFileExample.main0(SignFileExample.java:224)
at JCPxml.dsig.internal.xmldsigri.tests.SignFileExample.main(SignFileExample.java:202)
at com.itprofix.srv.crypto.Solution.main(Solution.java:45)
Caused by: java.lang.ClassNotFoundException: org.apache.xml.security.exceptions.AlgorithmAlreadyRegisteredException
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 4 more

Не подскажете с чем это может быть связано? Поиск по форуму ответов не дал.
Версия xmlsec:
Цитата:
<dependency>
<groupId>org.apache.santuario</groupId>
<artifactId>xmlsec</artifactId>
<version>1.5.0</version>
</dependency>

Код в собственном классе, который пытаюсь запустить:
Цитата:
SignFileExample signFileExample = new SignFileExample();
String inputFile = "C:\\Users\\MainUser\\workspace\\smx\\CryptoInput.txt";
String outputFile = "C:\\Users\\MainUser\\workspace\\smx\\CryptoOutput.txt";
String provider = "JCP";
String method = "CERT";

String[] testArray = new String[4];
testArray[0]=inputFile;
testArray[1]=outputFile;
testArray[2]=provider;
testArray[3]=method;

try {
signFileExample.main(testArray);
} catch (Exception e) {
e.printStackTrace();
}
Offline Евгений Афанасьев  
#4 Оставлено : 21 декабря 2018 г. 10:29:50(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Посмотрите https://www.cryptopro.ru....aspx?g=posts&t=3919 ,возможно, библиотеки лежат в разных местах.

Отредактировано пользователем 21 декабря 2018 г. 10:30:25(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
CryptoSKB оставлено 21.12.2018(UTC)
Offline CryptoSKB  
#5 Оставлено : 21 декабря 2018 г. 15:01:58(UTC)
CryptoSKB

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Автор: Евгений Афанасьев Перейти к цитате
Посмотрите https://www.cryptopro.ru....aspx?g=posts&t=3919 ,возможно, библиотеки лежат в разных местах.


Спасибо, ошибка ушла, переместил все библиотеки в одно место.

Дальше снова наткнулся на ошибку:
Цитата:
java.lang.ClassCastException: content[0] is not a valid X509Data type
at ru.CryptoPro.JCPxml.dsig.internal.dom.DOMX509Data.<init>(DOMX509Data.java:68)
at ru.CryptoPro.JCPxml.dsig.internal.dom.DOMKeyInfoFactory.newX509Data(DOMKeyInfoFactory.java:93)
at com.itprofix.srv.crypto.SignFileExample.main0(SignFileExample.java:427)
at com.itprofix.srv.crypto.SignFileExample.main(SignFileExample.java:245)
at com.itprofix.srv.crypto.Solution.main(Solution.java:40)


Возникает в строке:
Цитата:
// Создаем X509Data, содержащий сертификат.
X509Data x509d = keyInfoFactory.newX509Data(Collections.singletonList(cert));


Поискал решения на форуме - пока не помогло.

Добавил логирование:
Цитата:
System.out.println("cert:");
System.out.println(cert);
System.out.println("keyStore:");
System.out.println(keyStore);
System.out.println("keyStore.getDefaultType():");
System.out.println(keyStore.getDefaultType());
System.out.println("keyStore.getType():");
System.out.println(keyStore.getType());
System.out.println("keyStore.getProvider():");
System.out.println(keyStore.getProvider());
System.out.println("SpecUtility.DEFAULT_ALIAS:");
System.out.println(SpecUtility.DEFAULT_ALIAS);
System.out.println("keyStore.getCertificate(SpecUtility.DEFAULT_ALIAS):");
System.out.println(keyStore.getCertificate(SpecUtility.DEFAULT_ALIAS));


Цитата:
cert:
null
keyStore:
java.security.KeyStore@1fc268b
keyStore.getDefaultType():
jks
keyStore.getType():
HDImageStore
keyStore.getProvider():
JCP version 0.0
SpecUtility.DEFAULT_ALIAS:
DEFAULT_CERT_FILE = C:\Users\MainUser\workspace\temp\gost_dup.cer
gost_dup
keyStore.getCertificate(SpecUtility.DEFAULT_ALIAS):
[
[
Version: V3
Subject: CN=gost_dup
Signature Algorithm: 1.2.643.2.2.3, OID = 1.2.643.2.2.3

Key: ru.CryptoPro.JCP.Key.GostPublicKey
Validity: [From: Thu Dec 20 18:02:42 YEKT 2018,
To: Wed Mar 20 18:12:42 YEKT 2019]
Issuer: CN=CRYPTO-PRO Test Center 2, O=CRYPTO-PRO LLC, L=Moscow, C=RU, EMAILADDRESS=support@cryptopro.ru
SerialNumber: [ 12003084 e2250a36 ec1dd6b8 e3000000 3084e2]

Certificate Extensions: 6
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
[
accessMethod: caIssuers
accessLocation: URIName: http://testca.cryptopro....%20Test%20Center%202.crt
,
accessMethod: ocsp
accessLocation: URIName: http://testca.cryptopro.ru/ocsp/ocsp.srf
]
]

[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 15 31 7C B0 8D 1A DE 66 D7 15 9C 49 52 97 17 24 .1.....f...IR..$
0010: B9 01 7A 83 ..z.
]
]

[3]: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[URIName: http://testca.cryptopro....%20Test%20Center%202.crl]
]]

[4]: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
clientAuth
]

[5]: ObjectId: 2.5.29.15 Criticality=false
KeyUsage [
DigitalSignature
Non_repudiation
Key_Encipherment
]

[6]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 1C 35 65 63 19 F4 B6 C9 FD 24 58 2C 76 FC 55 63 .5ec.....$X,v.Uc
0010: 2C 17 B0 7D ,...
]
]

]
Algorithm: [1.2.643.2.2.3]
Signature:
0000: 0D 43 E6 1F 62 1C 51 3A 1A 71 8A 67 24 65 C3 5F .C..b.Q:.q.g$e._
0010: E3 AA FC 67 1C 22 15 B0 08 8C 3D 16 92 F9 03 48 ...g."....=....H
0020: 65 62 B5 32 CC 7A 6A B6 16 6F 61 FD 47 E6 E5 8C eb.2.zj..oa.G...
0030: 05 DC 79 8F EE D5 F6 D2 1F 70 35 34 3E 5B E7 57 ..y......p54>[.W

]
signatureMethodType = SIGN_WITH_CERT


Настройки файла crypto.properties:
Цитата:
org.apache.ws.security.crypto.provider=ru.wss4j1_6_3.ws.security.components.crypto.MerlinEx
org.apache.ws.security.crypto.merlin.keystore.type=HDImageStore
org.apache.ws.security.crypto.merlin.keystore.password=password
org.apache.ws.security.crypto.merlin.keystore.alias=gost_dup
cert.file=C:\\Users\\MainUser\\workspace\\temp\\gost_dup.cer


Файл cert.file=C:\\Users\\MainUser\\workspace\\temp\\gost_dup.cer действительно лежит в указанной директории.

Направьте, пожалуйста, в нужном направлении. Есть подозрение, что причина ошибки именно в:
Цитата:
cert:
null

Возможно неверно указаны входные параметры? В инструкциях нет описания что именно нужно прописывать в данные переменные, поэтому вставлял сам:
Цитата:
String provider = "JCP";
String method = "CERT";

Отредактировано пользователем 21 декабря 2018 г. 15:03:20(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#6 Оставлено : 21 декабря 2018 г. 16:02:47(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Что представляет в вашем коде объект cert? Он заполнен перед передачей в newX509Data?
Offline CryptoSKB  
#7 Оставлено : 24 декабря 2018 г. 9:49:07(UTC)
CryptoSKB

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Автор: Евгений Афанасьев Перейти к цитате
Что представляет в вашем коде объект cert? Он заполнен перед передачей в newX509Data?


Доброе утро. Нет, cert судя по всему не заполнен.
Код:
Цитата:
KeyStore keyStore = KeyStore.getInstance(
provider.equalsIgnoreCase(JCP.PROVIDER_NAME) ? JCP.HD_STORE_NAME : JCSP_DEFAULT_STORE_TYPE);
keyStore.load(null, null);

System.out.println("Алгоритм ключа = " + keyType.toString());
IXAdESConfig container = XmlContainer.createContainer(keyType);
System.out.println("container:");
System.out.println(container);

// Получаем ключ подписи.
PrivateKey privateKey;

if (provider.equalsIgnoreCase("JCSP")) {

JCPProtectionParameter parameter = new JCPProtectionParameter(
container.getSignatureContainer().getPassword());

JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry) keyStore.getEntry(
container.getSignatureContainer().getAlias(), parameter);

privateKey = entry.getPrivateKey();

} // if
else {
privateKey = (PrivateKey) keyStore.getKey(
container.getSignatureContainer().getAlias(),
container.getSignatureContainer().getPassword());
System.out.println("privateKey:");
System.out.println(privateKey);
} // else

// Сертификат для помещения в X509Data (KeyInfo).
X509Certificate cert = (X509Certificate) keyStore.getCertificate(
container.getSignatureContainer().getAlias());
System.out.println("container.getSignatureContainer().getAlias():");
System.out.println(container.getSignatureContainer().getAlias());
System.out.println("cert:");
System.out.println(cert);

Вывод в лог:
Цитата:
Алгоритм ключа = kt2001
container:
xades.config.XAdESConfig@197cf0d
privateKey:
null
container.getSignatureContainer().getAlias():
GostUsr
cert:
null


Начал заново - очистил папку temp, в которой хранились сертификаты и запустил тест класса CMS.java. Появилось 6 сертификатов:
qeqeqe.JPG (42kb) загружен 8 раз(а).

Тип файла у сертификатов - "Сертификаты PKCS #7". Как раз то, чем мне нужно подписать XML документ.

Далее встает вопрос - каким образом указать путь к одному из этих сертификатов. И какой из них подходит для моего случая?

Плюс судя по логам privateKey так же возвращает null.

Я правильно понимаю алгоритм подписи XML сертификатом PKCS #7?
1. Создаем сертификат PKCS #7 с помощью CMS.java
2. Запускаем тест SignFileExample - получаем на выходе подписанную XML.

Отредактировано пользователем 24 декабря 2018 г. 10:05:06(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#8 Оставлено : 24 декабря 2018 г. 12:14:20(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
В самом ключевом контейнере, который используется для подписи, сертификат есть? Пример SignFileExample подписывает XML документ, добавляя подпись по стандарту XMLDSig, не CMS. CMS.java может создавать контейнер и сертификат с другим именем контейнера, который не подходит примеру SignFileExample (это разные примеры). Пример использует контейнеры с именами: "cdsUr01" с паролем "с1" (ГОСТ 2001), "GostUsr" без пароля (ГОСТ 2001), "cdsUr256" с паролем "c2" (ГОСТ 2012 256), "cdsUr512" с паролем "c3" (ГОСТ 2012 512) (см. xades.config.XAdESConfig).
Offline CryptoSKB  
#9 Оставлено : 24 декабря 2018 г. 12:28:41(UTC)
CryptoSKB

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Автор: Евгений Афанасьев Перейти к цитате
В самом ключевом контейнере, который используется для подписи, сертификат есть? Пример SignFileExample подписывает XML документ, добавляя подпись по стандарту XMLDSig, не CMS. CMS.java может создавать контейнер и сертификат с другим именем контейнера, который не подходит примеру SignFileExample (это разные примеры). Пример использует контейнеры с именами: "cdsUr01" с паролем "с1" (ГОСТ 2001), "GostUsr" без пароля (ГОСТ 2001), "cdsUr256" с паролем "c2" (ГОСТ 2012 256), "cdsUr512" с паролем "c3" (ГОСТ 2012 512) (см. xades.config.XAdESConfig).


Но у меня задача стоит подписать документ именно с помощью PKCS#7, а не с XMLDSig.

Похоже я зря бился с запуском SignFileExample. Для подписи с помощью PKCS#7 нужен тест CMSSign?
Запустил CMSSign.java, отработал без ошибок.
Правильно ли я понимаю, что стандарт CMS = стандарт PKCS#7?

Отредактировано пользователем 24 декабря 2018 г. 13:21:32(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#10 Оставлено : 24 декабря 2018 г. 14:22:17(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Да, для создания подписи формата PKCS7 (CMS) подойдет CMS, CMSign. С помощью CMSVerify сможете проверить подписи.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
CryptoSKB оставлено 24.12.2018(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.