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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline drkswg  
#1 Оставлено : 8 апреля 2021 г. 17:35:51(UTC)
drkswg

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

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

Сказал(а) «Спасибо»: 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());
            }
        }
Offline Санчир Момолдаев  
#2 Оставлено : 8 апреля 2021 г. 17:51:09(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 61 раз
Поблагодарили: 139 раз в 137 постах
Добрый день!
может нужно вложить в подпись сертификат?

пример посмотрите здесь
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
drkswg оставлено 02.06.2021(UTC)
Offline Евгений Афанасьев  
#3 Оставлено : 8 апреля 2021 г. 19:30:19(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 17 раз
Поблагодарили: 563 раз в 537 постах
Еще можно так: https://www.cryptopro.ru...&m=119398#post119398
С помощью параметра addCertificateChain = true в ф. addSigner().
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
drkswg оставлено 02.06.2021(UTC)
Offline drkswg  
#4 Оставлено : 2 июня 2021 г. 16:45:12(UTC)
drkswg

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

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

Сказал(а) «Спасибо»: 4 раз
Вложил сертификат владельца, спасибо. Но путем проб и ошибок понял, в чем проблема: необходимо добавить идентификатор ресурса (приложил фото как это отображается в КриптоАрм). Не подскажете, как можно это реализовать с помощью JCP? Screenshot_2.png (8kb) загружен 9 раз(а). Screenshot_1.png (19kb) загружен 18 раз(а).
Offline Евгений Афанасьев  
#5 Оставлено : 4 июня 2021 г. 14:01:50(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 17 раз
Поблагодарили: 563 раз в 537 постах
Приложите подпись с указанным атрибутом, чтобы можно было понять, что он из себя представляет.
Offline drkswg  
#6 Оставлено : 4 июня 2021 г. 14:09:28(UTC)
drkswg

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

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

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

hello world.txt (1kb) загружен 0 раз(а). hello world.txt.sig (6kb) загружен 2 раз(а).

Offline Евгений Афанасьев  
#7 Оставлено : 7 июня 2021 г. 0:19:39(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 17 раз
Поблагодарили: 563 раз в 537 постах
Среди подписанных атрибутов приложенной подписи нашел такие:
Цитата:

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. Тогда атрибуты из этой таблицы будут подписаны наряду с другими при создании подписи и попадут в итоговый набор.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
drkswg оставлено 07.06.2021(UTC)
Offline two_oceans  
#8 Оставлено : 7 июня 2021 г. 1:34:12(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,219
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 80 раз
Поблагодарили: 285 раз в 269 постах
Цитата:
Что это за атрибуты и почему во втором атрибуте 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.1
2) атрибут с 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=8511
https://www.cryptopro.ru...ts&m=39131#post39131

Отредактировано пользователем 7 июня 2021 г. 1:43:35(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Евгений Афанасьев оставлено 07.06.2021(UTC)
Offline drkswg  
#9 Оставлено : 7 июня 2021 г. 14:53:11(UTC)
drkswg

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

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

Сказал(а) «Спасибо»: 4 раз
Евгений, спасибо, получилось добавить данные атрибуты. Но, к сожалению, сервис все равно говорит, что проверка ЭП не пройдена. В связи с этим возник вопрос: я устанавливал из файла .pfx сертификат и закрытый ключ в HDImageStore, и ключ указан там как "ключ обмена", из-за чего видимо при подписи через JCP используется алгоритм "ГОСТ Р 34.10-2012 DH 256 бит", хотя при подписи через КриптоАрм ключом из этого же контейнера используется "ГОСТ Р 34.10-2012 256 бит" (при этом отдельного ключа подписи в контейнере нет). Не подскажете, как я могу через JCP с помощью этого же контейнера использовать алгоритм подписи "ГОСТ Р 34.10-2012 256 бит"?
Offline Евгений Афанасьев  
#10 Оставлено : 7 июня 2021 г. 15:09:40(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 17 раз
Поблагодарили: 563 раз в 537 постах
Если вы имеете в виду OID алгоритма подписи в формируемой подписи, то попробуйте использовать JCP >= 2.0.41473, в этой версии зафиксировали OID ключа подписи.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
drkswg оставлено 08.06.2021(UTC)
Offline drkswg  
#11 Оставлено : 8 июня 2021 г. 10:37:46(UTC)
drkswg

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

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

Сказал(а) «Спасибо»: 4 раз
Автор: Евгений Афанасьев Перейти к цитате
Если вы имеете в виду OID алгоритма подписи в формируемой подписи, то попробуйте использовать JCP >= 2.0.41473, в этой версии зафиксировали OID ключа подписи.


Огромное спасибо, обновил JCP до версии 2.0.41789, сервис наконец принял подпись.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.