Статус: Новичок
Группы: Участники
Зарегистрирован: 08.04.2021(UTC) Сообщений: 6 Откуда: Москва Сказал(а) «Спасибо»: 4 раз
|
Добрый день, пытаюсь сделать программу для формирования отделенной подписи Cades-BES для передачи документов в систему ГАС "Правосудие". Проблема в том, что подпись проходит проверку через КриптоАРМ, проходит проверку на вашем портале онлайн проверки подписей, но на ГАС почему-то валится. При этом подпись, которую я формирую через тот же КриптоАРМ проверку проходит. Возможно вы меня на верный путь сможете направить. Код:private static IConfiguration createConfig(ISignatureContainer container, boolean useStream) throws Exception {
IConfiguration config = new SimpleConfiguration(container, true, useStream);
config.setSignedAttributes(Configuration.getSomeSignedAttributes(true, false));
config.setUnsignedAttributes(Configuration.getSomeUnsignedAttributes(false));
config.setCRLStore(new CollectionStore(config.getCRLsHolder()));
config.setCertificateStore(new CollectionStore(config.getChainHolder()));
return config;
}
private static void executeSign(IConfiguration configuration) throws Exception {
System.setProperty("ru.CryptoPro.reprov.enableCRLDP", "true");
System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");
String directory = "C:\\Users\\username\\Desktop\\testDir";
List<File> fileList = new ArrayList<>(Arrays.asList(new File(directory).listFiles()));
for (File file : fileList) {
CAdESSignature cadesSignature = new CAdESSignature(configuration.detached());
cadesSignature.setCertificateStore(configuration.getCertificateStore());
cadesSignature.setCRLStore(configuration.getCRLStore());
cadesSignature.addSigner(configuration.getProviderName(),
configuration.getDigestOid(),
configuration.getPublicKeyOid(),
configuration.getPrivateKey(),
configuration.getChain(),
CAdESType.CAdES_BES,
null,
false,
configuration.getSignedAttributes(),
configuration.getUnsignedAttributes(),
configuration.getCRLs());
final byte[] data = Array.readFile(file);
ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
cadesSignature.open(signatureStream);
cadesSignature.update(data);
cadesSignature.close();
signatureStream.close();
byte[] cadesCms = signatureStream.toByteArray();
cadesCms = Base64.getEncoder().encode(cadesCms);
String cades = new String(cadesCms, StandardCharsets.UTF_8);
StringBuilder strBuilder = new StringBuilder(cades);
strBuilder.insert(0, "-----BEGIN CMS-----\r\n");
strBuilder.append("\r\n-----END CMS-----\r\n");
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file + ".sig"))) {
writer.write(strBuilder.toString());
}
}
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,195 Сказал(а) «Спасибо»: 100 раз Поблагодарили: 274 раз в 254 постах
|
Добрый день! может нужно вложить в подпись сертификат? пример посмотрите здесь |
|
1 пользователь поблагодарил Санчир Момолдаев за этот пост.
|
drkswg оставлено 02.06.2021(UTC)
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,964 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
|
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
drkswg оставлено 02.06.2021(UTC)
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 08.04.2021(UTC) Сообщений: 6 Откуда: Москва Сказал(а) «Спасибо»: 4 раз
|
Вложил сертификат владельца, спасибо. Но путем проб и ошибок понял, в чем проблема: необходимо добавить идентификатор ресурса (приложил фото как это отображается в КриптоАрм). Не подскажете, как можно это реализовать с помощью JCP? Screenshot_2.png (8kb) загружен 11 раз(а). Screenshot_1.png (19kb) загружен 21 раз(а).
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,964 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Приложите подпись с указанным атрибутом, чтобы можно было понять, что он из себя представляет. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 08.04.2021(UTC) Сообщений: 6 Откуда: Москва Сказал(а) «Спасибо»: 4 раз
|
Автор: Евгений Афанасьев Приложите подпись с указанным атрибутом, чтобы можно было понять, что он из себя представляет. hello world.txt (1kb) загружен 0 раз(а). hello world.txt.sig (6kb) загружен 2 раз(а).
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,964 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Среди подписанных атрибутов приложенной подписи нашел такие: Цитата: SEQUENCE (2 elem) __OBJECT IDENTIFIER 1.2.643.2.45.1.1.2 __SET (1 elem) ____BMPString file:hello world.txt SEQUENCE (2 elem) __OBJECT IDENTIFIER 1.3.6.1.4.1.311.2.1.120 __SET (1 elem) ____SEQUENCE (3 elem) ______BMPString ______BMPString file:hello world.txt ______BMPString
Что это за атрибуты и почему во втором атрибуте 3 строки, но две - пустых, вам нужно обратиться к документации, описывающий формат подписи, принимаемой другой стороной. Чтобы сделать подобные атрибуты, можно написать что-то вроде: Код:
import org.bouncycastle.asn1.*;
import org.bouncycastle.asn1.cms.Attribute;
import org.bouncycastle.asn1.cms.AttributeTable;
import java.util.Hashtable;
final Hashtable table = new Hashtable();
final DERBMPString encodedId = new DERBMPString("file:hello world.txt"); // ваш пример
Attribute attr1 = new Attribute(new ASN1ObjectIdentifier("1.2.643.2.45.1.1.2"), new DERSet(encodedId)); // первый атрибут с одной строкой
DERSequence seq = new DERSequence(new ASN1Encodable[] {new DERBMPString(""), encodedId, new DERBMPString("")}); // как в примере, две пустых строки
Attribute attr2 = new Attribute(new ASN1ObjectIdentifier("1.3.6.1.4.1.311.2.1.120"), new DERSet(seq)); // второй атрибут с тремя строками, две из них - пустые
table.put(attr1.getAttrType(), attr1);
table.put(attr2.getAttrType(), attr2);
AttributeTable attrs = new AttributeTable(table); // таблица атрибутов для передачи в addSigner
Итоговый attrs надо передать в addSigner() в параметр AttributeTable signedAttributes, есть такие версии addSigner() в классе CAdESSignature. Тогда атрибуты из этой таблицы будут подписаны наряду с другими при создании подписи и попадут в итоговый набор. |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
drkswg оставлено 07.06.2021(UTC)
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Цитата:Что это за атрибуты и почему во втором атрибуте 3 строки, но две - пустых, вам нужно обратиться к документации, описывающий формат подписи, принимаемой другой стороной. К сожалению, принимающая сторона часто не связывает с разработчиками, а рядовые сотрудники техподдержки знают только слова "усиленная квалифицированная", в лучшем случае "отсоединенная". Не зря ведь задавший вопрос пишет "путем проб и ошибок". Скорее эти атрибуты надо смотреть в документации на КриптоАРМ. Далее "путем проб и ошибок" нужно подобрать какой из них "смотрит" принимающая сторона. Насколько помню, на форуме уже поднимался вопрос по этим оидам (но в части соседнего атрибута "использование подписи") и "путем проб и ошибок" оказалось следующее: 1) атрибут с 3 стороками (вроде как перешел из более старой версии КриптоАРМ) - содержит также строки "комментарий" и "использование подписи" (они как раз пусты) вместе с "Идентификатор ресурса". Оиды 1.3.6.1.4.1.311 - ветка оидов Майкрософт, 2(Authenticode),1(Software Publishing), для 120 соответствия не вижу https://oidref.com/1.3.6.1.4.1.311.2.12) атрибут с 1 строкой (появился на версиях КриптоАрм поновее) - разработчики КриптоАРМ зарегистрировали отдельный оид для каждой из трех строк пункта 1 (1.2.643.2.45 именно их собственная ветка оидов - https://oid.iitrust.ru/oid_search/11/), в которой они "первым делом" завели три этих оида (1.1.1,1.1.2,1.1.3). https://www.cryptopro.ru....aspx?g=posts&t=8511https://www.cryptopro.ru...ts&m=39131#post39131Отредактировано пользователем 7 июня 2021 г. 1:43:35(UTC)
| Причина: Не указана
|
1 пользователь поблагодарил two_oceans за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 08.04.2021(UTC) Сообщений: 6 Откуда: Москва Сказал(а) «Спасибо»: 4 раз
|
Евгений, спасибо, получилось добавить данные атрибуты. Но, к сожалению, сервис все равно говорит, что проверка ЭП не пройдена. В связи с этим возник вопрос: я устанавливал из файла .pfx сертификат и закрытый ключ в HDImageStore, и ключ указан там как "ключ обмена", из-за чего видимо при подписи через JCP используется алгоритм "ГОСТ Р 34.10-2012 DH 256 бит", хотя при подписи через КриптоАрм ключом из этого же контейнера используется "ГОСТ Р 34.10-2012 256 бит" (при этом отдельного ключа подписи в контейнере нет). Не подскажете, как я могу через JCP с помощью этого же контейнера использовать алгоритм подписи "ГОСТ Р 34.10-2012 256 бит"?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,964 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Если вы имеете в виду OID алгоритма подписи в формируемой подписи, то попробуйте использовать JCP >= 2.0.41473, в этой версии зафиксировали OID ключа подписи. |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
drkswg оставлено 08.06.2021(UTC)
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close