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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline LenaPot  
#1 Оставлено : 5 июля 2022 г. 15:06:50(UTC)
LenaPot

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

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

Сказал(а) «Спасибо»: 2 раз
Здравствуйте!

Подскажите, пожалуйтса, есть ли возможность объединить две существующие подписи в одну?
Offline Санчир Момолдаев  
#2 Оставлено : 6 июля 2022 г. 10:00:02(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 106 раз
Поблагодарили: 296 раз в 276 постах
Добрый день
можно. но есть ограничение. подписанты должны быть по одному алгоритму.
смотрите в сторону replaceSigners
Техническую поддержку оказываем тут
Наша база знаний
Offline LenaPot  
#3 Оставлено : 6 июля 2022 г. 14:25:11(UTC)
LenaPot

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

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

Сказал(а) «Спасибо»: 2 раз
Автор: Санчир Момолдаев Перейти к цитате
Добрый день
можно. но есть ограничение. подписанты должны быть по одному алгоритму.
смотрите в сторону replaceSigners


А в каком классе этот метод искать?

Отредактировано пользователем 6 июля 2022 г. 15:24:26(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#4 Оставлено : 7 июля 2022 г. 7:42:15(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 106 раз
Поблагодарили: 296 раз в 276 постах
давайте пример покажу
Код:
        // включаем параметры для кадес
        System.setProperty("com.sun.security.enableCRLDP", "true"); //crl online
        System.setProperty("com.sun.security.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
        System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети

        // временный алиас для создания шаблона подписи.
        String alias = "test2012";

        String dir = System.getProperty("user.home");
        String datafile = "data.txt";
        String sign1file = "sign1.sig";
        String sign2file = "sign2.sig";
        String mergedFile = "merged.sig";

        // читаем файл с данными и файлы подписи. файлы подписи в DER кодировке
        byte[] data = Files.readAllBytes(Paths.get(dir + File.separator + datafile));
        byte[] sign1 = Files.readAllBytes(Paths.get(dir + File.separator + sign1file));
        byte[] sign2 = Files.readAllBytes(Paths.get(dir + File.separator + sign2file));

        // вытаскиваем подписанта из первой подписи
        CAdESSignature cAdESSignature1 = new CAdESSignature(sign1, data, null);
        CAdESSigner signer1 = cAdESSignature1.getCAdESSignerInfo(0);

        // вытаскиваем подписанта из второй подписи
        CAdESSignature cAdESSignature2 = new CAdESSignature(sign2, data, null);
        CAdESSigner signer2 = cAdESSignature2.getCAdESSignerInfo(0);

        // смотрим имена субъектов
        System.out.println(signer1.getSignerCertificate().getSubjectDN());
        System.out.println(signer2.getSignerCertificate().getSubjectDN());

        // готовим коллекцию из сертификатов собранных из имеющихся подписей
        Collection<X509CertificateHolder> certHolders = new ArrayList<>();
        certHolders.add(new X509CertificateHolder(signer1.getSignerCertificate().getEncoded())); // первый
        certHolders.add(new X509CertificateHolder(signer2.getSignerCertificate().getEncoded())); // второй

        // тут и далее создаем файл подписи-болванку для последующей замены
        // следует отметить что все подписанты должны быть по одному алгоритму гост. Например, гост2012-256.
        KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME, JCP.PROVIDER_NAME);
        keyStore.load(null, null);
        PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, "".toCharArray());

        // на всякий случай устанавливаем провайдер JCP как провайдер по умолчанию
        AdESConfig.setDefaultProvider(JCP.PROVIDER_NAME);
        // временная подпись куда мы вставим подписантов
        ByteArrayOutputStream signature = new ByteArrayOutputStream();
        // создаем открепленную подпись
        CAdESSignature mergedSignature = new CAdESSignature(true);
        // отключаем проверку сертификата для cades-bes для ускорения.
        mergedSignature.setOptions(new Options().disableCertificateValidation());
        // добавляем временного подписанта
        mergedSignature.addSigner(
                JCP.PROVIDER_NAME,
                privateKey,
                Arrays.asList((X509Certificate) keyStore.getCertificate(alias)),
                CAdESType.CAdES_BES,
                "",
                false
        );
        // Устанавливаем сертификаты для проверки подписи. Причем устанавливаем их из sign1 и sign2
        mergedSignature.setCertificateStore(new CollectionStore(certHolders));
        // записывает результат в signature
        mergedSignature.open(signature);
        mergedSignature.update(data);
        mergedSignature.close();

        // подготовка коллекции signer info для последующей замены
        Collection<SignerInformation> signerInfos = new ArrayList<SignerInformation>();
        signerInfos.add(signer1.getSignerInfo()); // первый
        signerInfos.add(signer2.getSignerInfo()); // второй

        SignerInformationStore signerInfoStore = new SignerInformationStore(signerInfos);
        InputStream srcSignerStream = new ByteArrayInputStream(signature.toByteArray());
        ByteArrayOutputStream dstSigneBuffer = new ByteArrayOutputStream();

        // тут происходит подмена подписантов. т.е. убираем подписанта из временной подписи и вставляем нужных двух
        CAdESSignature.replaceSigners(srcSignerStream, signerInfoStore, dstSigneBuffer);

        // проверяем полученную подпись.
        CAdESSignature verify = new CAdESSignature(dstSigneBuffer.toByteArray(), data, null);
        verify.verify(null, null);

        // выводим имя субъекта у подписанта с индексом 0 и 1
        System.out.println(verify.getCAdESSignerInfo(0).getSignerCertificate().getSubjectDN());
        System.out.println(verify.getCAdESSignerInfo(1).getSignerCertificate().getSubjectDN());

        // записываем результат в файл
        File outputFile = new File(dir + File.separator + mergedFile);
        FileOutputStream fos = new FileOutputStream(outputFile);
        fos.write(dstSigneBuffer.toByteArray());
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
LenaPot оставлено 08.07.2022(UTC)
Offline LenaPot  
#5 Оставлено : 8 июля 2022 г. 10:06:59(UTC)
LenaPot

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

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

Сказал(а) «Спасибо»: 2 раз
Автор: Санчир Момолдаев Перейти к цитате
давайте пример покажу
Код:
        // включаем параметры для кадес
        System.setProperty("com.sun.security.enableCRLDP", "true"); //crl online
        System.setProperty("com.sun.security.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
        System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети

        // временный алиас для создания шаблона подписи.
        String alias = "test2012";

        String dir = System.getProperty("user.home");
        String datafile = "data.txt";
        String sign1file = "sign1.sig";
        String sign2file = "sign2.sig";
        String mergedFile = "merged.sig";

        // читаем файл с данными и файлы подписи. файлы подписи в DER кодировке
        byte[] data = Files.readAllBytes(Paths.get(dir + File.separator + datafile));
        byte[] sign1 = Files.readAllBytes(Paths.get(dir + File.separator + sign1file));
        byte[] sign2 = Files.readAllBytes(Paths.get(dir + File.separator + sign2file));

        // вытаскиваем подписанта из первой подписи
        CAdESSignature cAdESSignature1 = new CAdESSignature(sign1, data, null);
        CAdESSigner signer1 = cAdESSignature1.getCAdESSignerInfo(0);

        // вытаскиваем подписанта из второй подписи
        CAdESSignature cAdESSignature2 = new CAdESSignature(sign2, data, null);
        CAdESSigner signer2 = cAdESSignature2.getCAdESSignerInfo(0);

        // смотрим имена субъектов
        System.out.println(signer1.getSignerCertificate().getSubjectDN());
        System.out.println(signer2.getSignerCertificate().getSubjectDN());

        // готовим коллекцию из сертификатов собранных из имеющихся подписей
        Collection<X509CertificateHolder> certHolders = new ArrayList<>();
        certHolders.add(new X509CertificateHolder(signer1.getSignerCertificate().getEncoded())); // первый
        certHolders.add(new X509CertificateHolder(signer2.getSignerCertificate().getEncoded())); // второй

        // тут и далее создаем файл подписи-болванку для последующей замены
        // следует отметить что все подписанты должны быть по одному алгоритму гост. Например, гост2012-256.
        KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME, JCP.PROVIDER_NAME);
        keyStore.load(null, null);
        PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, "".toCharArray());

        // на всякий случай устанавливаем провайдер JCP как провайдер по умолчанию
        AdESConfig.setDefaultProvider(JCP.PROVIDER_NAME);
        // временная подпись куда мы вставим подписантов
        ByteArrayOutputStream signature = new ByteArrayOutputStream();
        // создаем открепленную подпись
        CAdESSignature mergedSignature = new CAdESSignature(true);
        // отключаем проверку сертификата для cades-bes для ускорения.
        mergedSignature.setOptions(new Options().disableCertificateValidation());
        // добавляем временного подписанта
        mergedSignature.addSigner(
                JCP.PROVIDER_NAME,
                privateKey,
                Arrays.asList((X509Certificate) keyStore.getCertificate(alias)),
                CAdESType.CAdES_BES,
                "",
                false
        );
        // Устанавливаем сертификаты для проверки подписи. Причем устанавливаем их из sign1 и sign2
        mergedSignature.setCertificateStore(new CollectionStore(certHolders));
        // записывает результат в signature
        mergedSignature.open(signature);
        mergedSignature.update(data);
        mergedSignature.close();

        // подготовка коллекции signer info для последующей замены
        Collection<SignerInformation> signerInfos = new ArrayList<SignerInformation>();
        signerInfos.add(signer1.getSignerInfo()); // первый
        signerInfos.add(signer2.getSignerInfo()); // второй

        SignerInformationStore signerInfoStore = new SignerInformationStore(signerInfos);
        InputStream srcSignerStream = new ByteArrayInputStream(signature.toByteArray());
        ByteArrayOutputStream dstSigneBuffer = new ByteArrayOutputStream();

        // тут происходит подмена подписантов. т.е. убираем подписанта из временной подписи и вставляем нужных двух
        CAdESSignature.replaceSigners(srcSignerStream, signerInfoStore, dstSigneBuffer);

        // проверяем полученную подпись.
        CAdESSignature verify = new CAdESSignature(dstSigneBuffer.toByteArray(), data, null);
        verify.verify(null, null);

        // выводим имя субъекта у подписанта с индексом 0 и 1
        System.out.println(verify.getCAdESSignerInfo(0).getSignerCertificate().getSubjectDN());
        System.out.println(verify.getCAdESSignerInfo(1).getSignerCertificate().getSubjectDN());

        // записываем результат в файл
        File outputFile = new File(dir + File.separator + mergedFile);
        FileOutputStream fos = new FileOutputStream(outputFile);
        fos.write(dstSigneBuffer.toByteArray());


у меня keyStore.getCertificate(alias)почему то null, соответственно возникает NPE
Это может быть связано с неверной установкой JCP? у меня mac os (java 17), JCP я добавила как библиотеки. Нужно ли сделать чтото еще?
Offline Евгений Афанасьев  
#6 Оставлено : 8 июля 2022 г. 10:52:54(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 740 раз в 698 постах
Здравствуйте. Ключевой контейнер alias существует?
Offline egn.p  
#7 Оставлено : 10 июня 2024 г. 13:49:53(UTC)
egn.p

Статус: Участник

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

Сказал(а) «Спасибо»: 4 раз
А есть возможность выполнить объединение подписей через CoSign?
Offline Санчир Момолдаев  
#8 Оставлено : 22 июня 2024 г. 13:35:34(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 106 раз
Поблагодарили: 296 раз в 276 постах
В jcp не cosign
Это есть только в плагине
Техническую поддержку оказываем тут
Наша база знаний
Offline Санчир Момолдаев  
#9 Оставлено : 22 июня 2024 г. 13:36:57(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 106 раз
Поблагодарили: 296 раз в 276 постах
Возможно вам нужно инстанцировать уже имеющуюся подпись и выполнить addSigner
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.