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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Алексей Вдовин  
#1 Оставлено : 6 декабря 2024 г. 13:55:52(UTC)
Алексей Вдовин

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

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

Сказал(а) «Спасибо»: 77 раз
Поблагодарили: 1 раз в 1 постах
Подскажите по файлу получить информацию ЭЦП?

ФИО подписанта, организация, дата подписания и т.п.

что касается подписанта - вроде нашел
CAdESSignature cAdESSignature = new CAdESSignature(Base64.decode(fileContent), null, null);
CAdESSigner cAdESSigner = cAdESSignature.getCAdESSignerInfo(1);


получаюю сертификат (хотел из него SubjectName вытащить и оттуда ФИО и т.п.) - возвращает null
X509Certificate certificate = cAdESSigner.getSignerCertificate();


файл с присоединённой подписью создал
CAdESSignature cadesSignature = new CAdESSignature(isDetached);
...

в ГУИ проверка проходит - и информацию о подписанте отображает

Отредактировано пользователем 6 декабря 2024 г. 14:55:29(UTC)  | Причина: Не указана

Offline Алексей Вдовин  
#2 Оставлено : 9 декабря 2024 г. 9:29:35(UTC)
Алексей Вдовин

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

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

Сказал(а) «Спасибо»: 77 раз
Поблагодарили: 1 раз в 1 постах
Проверку получилось реализовать, но только передав контейнер ключа - такой метод не подходит, т.к. нужно проверять подпись без сертификата которым подписывалось - т.е. на входе файл с присоединённой подписью (либо отсодинённая и файл с данными)

Код:

        try {
            cmsSignedData.verifySignatures();

            KeyStore keyStore = KeyStore.getInstance("RutokenStore", "JCP");
            keyStore.load(null, null);

            // Получаем цепочку сертификатов.
            List<Certificate> lChain = Arrays.asList(keyStore.getCertificate("3e428a1c-af93-451d-a456-9889564df7c1"));

            // Конвертируем цепочку в X509Certificate.
            Collection<X509Certificate> xChain =
                    Arrays.asList((lChain).toArray(new X509Certificate[lChain.size()]));

            Collection<X509Certificate> chain = new ArrayList<>(List.of());
            chain.addAll(xChain);

            CAdESSignature cadesToVerify = new CAdESSignature(Base64.decode(fileContent),null,null);
            cadesToVerify.verify(new HashSet<>(chain));

            CAdESSignature cAdESSignature = new CAdESSignature(Base64.decode(fileContent), null, null);
            CAdESSigner cAdESSigner = cAdESSignature.getCAdESSignerInfo(0);
            X509Certificate certificate = cAdESSigner.getSignerCertificate();

            System.out.println("certificate : "+certificate);

        } catch (CAdESException e) {
            throw new RuntimeException(e);
        }


Да и сам сертификат почему то null

В общем этот метод не подохдит, попробую реализовать через CMSSignedData
Т.е. цель - адаптировать вот такой код на php
https://docs.cryptopro.ru/cades/phpcades/phpcades-samples
на java



Offline Андрей *  
#3 Оставлено : 9 декабря 2024 г. 10:50:59(UTC)
Андрей *

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

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

Сказал «Спасибо»: 553 раз
Поблагодарили: 2235 раз в 1743 постах
Здравствуйте.

Цепочка должна строиться из хранилищ корневых и промежуточных УЦ,
а не подключением сертификата из контейнера.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Алексей Вдовин оставлено 09.12.2024(UTC)
Offline Алексей Вдовин  
#4 Оставлено : 9 декабря 2024 г. 11:14:37(UTC)
Алексей Вдовин

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

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

Сказал(а) «Спасибо»: 77 раз
Поблагодарили: 1 раз в 1 постах
Автор: Андрей * Перейти к цитате
Здравствуйте.

Цепочка должна строиться из хранилищ корневых и промежуточных УЦ,
а не подключением сертификата из контейнера.


Как её построить из хранилищ корневых и промежуточных УЦ?
Offline Алексей Вдовин  
#5 Оставлено : 11 декабря 2024 г. 10:34:59(UTC)
Алексей Вдовин

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

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

Сказал(а) «Спасибо»: 77 раз
Поблагодарили: 1 раз в 1 постах
в моём случае проверка заработала после того как я изменил её формирование - при подписании добавил сертификаты

выложу код, может пригодиться кому

Код:

            keyStore = KeyStore.getInstance("HDImageStore", "JCP");  
            alias = "PHP1";  // контейнер с тестовым сертификатом
            password = "".toCharArray();

            keyStore.load(null, null);

            // Закрытый ключ подписи
            PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password);

            // Цепочка сертификатов подписи
            List<Certificate> lChain = Arrays.asList(keyStore.getCertificateChain(alias));

            // Создаем CAdES подпись.
            CAdESSignature cadesSignature = new CAdESSignature(isDetached);

            Collection<X509CertificateHolder> certificateHolders = new ArrayList<>();
            certificateHolders.add(new X509CertificateHolder(keyStore.getCertificate(alias).getEncoded()));
            CollectionStore<X509CertificateHolder> store = new CollectionStore<>(certificateHolders);
            cadesSignature.setCertificateStore(store);

            // Добавляем CAdES-BES подпись
            cadesSignature.addSigner(
                    JCP.PROVIDER_NAME,
                    JCP.GOST_DIGEST_OID,
                    JCP.GOST_EL_KEY_OID,
                    privateKey,
                    lChain,
                    CAdESType.CAdES_BES,
                    null,
                    false
            );

            // Будущая подпись в виде массива.
            ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();

            cadesSignature.open(signatureStream); // подготовка контекста
            cadesSignature.update(fileContent); // хеширование

            cadesSignature.close(); // создание подписи с выводом в signatureStream
            signatureStream.close();

            // Получаем подпись в виде массива.
            return signatureStream.toByteArray();


сама проверка
Код:

byte[] fileContent = Base64.decode(file.getBytes());
            CAdESSignature cadesToVerify = new CAdESSignature(fileContent, null, null);
            cadesToVerify.verify(null);

для отсоединённой
Код:

byte[] fileContent = file.getBytes();
            byte[] signatureContent = Base64.decode(signature.getBytes());

            CAdESSignature cadesToVerify = new CAdESSignature(signatureContent, fileContent, null);
            cadesToVerify.verify(null);


правда отрабатывает долго - секунд 30 ... этот вопрос пока не решил

Отредактировано пользователем 11 декабря 2024 г. 10:36:59(UTC)  | Причина: Не указана

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