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

Уведомление

Icon
Error

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

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

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

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

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

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

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

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Еще можно так: 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)
Сообщений: 6
Российская Федерация
Откуда: Москва

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

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

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

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

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

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

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

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

Группы: Участники
Зарегистрирован: 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.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)
Сообщений: 6
Российская Федерация
Откуда: Москва

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Если вы имеете в виду OID алгоритма подписи в формируемой подписи, то попробуйте использовать JCP >= 2.0.41473, в этой версии зафиксировали OID ключа подписи.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
drkswg оставлено 08.06.2021(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.