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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline maximkosheev  
#1 Оставлено : 7 ноября 2018 г. 18:54:10(UTC)
maximkosheev

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

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

Сказал(а) «Спасибо»: 4 раз
Добрый день!
Работаю над программой на Java + JCP. Хочу в этой программе реализовать подпись как в плагине.
Что у меня есть:
- ОС Windows 7
- фиксированный массив байт для тестов;
- плагин для браузера (CAdESCOM);
- программа на java + JCP (CAdES).

Используя технологию COM, пишу такой скрипт на VB:

Код:

    Dim Store As CPStore
    Dim Certificates As ICertificates
    Dim Certificate As ICertificate
    Dim Signer As CPSigner
    Dim Signer1 As CPSigner
    Dim oSignedData As CadesSignedData
    Dim attr As CPAttribute
    
    Set Store = CreateObject("CAdESCOM.Store")
    Set Signer = CreateObject("CAdESCOM.CPSigner")
    Set oSignedData = CreateObject("CAdESCOM.CadesSignedData")
    
    Store.Open CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED
    Set Certificates = Store.Certificates
    Set Certificate = Certificates.Item(1)
    Signer.Certificate = Certificate
    Signer.Options = CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY
    
    
    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY
    oSignedData.Content = "MTAvMjAvMjAxOCAxNzozNDoyMw=="
    
    
    Dim Message As String
    
    Message = oSignedData.SignCades(Signer, CADES_BES, True)


Получаем итоге в переменной Message подпись в кодировке Base64 длинной 4696 байт/символов

Далее. Пишу на Java (правильнее сказать слегка меняю код из примера JCP/samples-sources/SignExample.java):

Код:

package CAdES;

import CAdES.configuration.Configuration;
import CAdES.configuration.IConfiguration;
import CAdES.configuration.SimpleConfiguration;

import CAdES.configuration.container.Container2001;
import CAdES.configuration.container.ISignatureContainer;
import org.bouncycastle.asn1.cms.AttributeTable;
import org.bouncycastle.util.CollectionStore;

import ru.CryptoPro.CAdES.CAdESSignature;
import ru.CryptoPro.CAdES.CAdESSigner;
import ru.CryptoPro.CAdES.CAdESType;
import ru.CryptoPro.CAdES.exception.CAdESException;
import ru.CryptoPro.JCP.tools.Array;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * Пример создания CAdES подписи.
 * 
 * 17/04/2012
 *
 */
public class SignExample {

    static {
        // Включаем возможность онлайновой проверки.
        System.setProperty("com.sun.security.enableCRLDP", "true");
        System.setProperty("com.ibm.security.enableCRLDP", "true");
    }


    /**
     * Создание CAdES-подписи с двумя подписантами: CAdES-BES и
     * CAdES-X Long Type 1.
     *
     * @param config Конфигурация подписи.
     * @param outFileName Файл для сохранения подписи.
     * @return готовую подпись.
     * @throws Exception
     */
    public static void createMixedSignatureWith2Signers(IConfiguration config, String outFileName) throws Exception {

        CAdESSignature cadesSignature = new CAdESSignature(config.detached());

        cadesSignature.setCertificateStore(config.getCertificateStore());
        cadesSignature.setCRLStore(config.getCRLStore());

        // Создаем подписанта CAdES-BES.
        cadesSignature.addSigner(config.getProviderName(),
                config.getPrivateKey(), config.getChain(), CAdESType.CAdES_BES, null, true);

        // Сохраним подпись либо в файл, либо в массив.
        ByteArrayOutputStream outSignatureStream = new ByteArrayOutputStream();

        cadesSignature.open(outSignatureStream);

        byte[] bytesToSing = Base64.getDecoder().decode("MTAvMjAvMjAxOCAxNzozNDoyMw==".getBytes(StandardCharsets.UTF_8));
        cadesSignature.update(bytesToSing);

        // Завершаем создание подписи с двумя подписантами.
        cadesSignature.close();
        outSignatureStream.close();

        byte[] cadesCms = Base64.getEncoder().encode(outSignatureStream.toByteArray());

        if (outFileName != null) {
            Array.writeFile(outFileName, cadesCms);
        }

        CAdESSigner[] signers = cadesSignature.getCAdESSignerInfos();
        System.out.println(signers.length);
    }

   /**
    * Создание CAdES подписи.
    *
    * @param container Описание используемого ключевого контейнера.
    * @param useStream True, если следует использовать поток данных и подписи.
    */
    public static void signExample(ISignatureContainer container, boolean useStream) {

	try {
            IConfiguration configDetached = new SimpleConfiguration(container, true, useStream);

            createMixedSignatureWith2Signers(configDetached, SimpleConfiguration.getTempFileName(null));
        } catch (Exception e) {
            Configuration.printCAdESException(e);
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        SignExample.signExample(new Container2001(), false);
    }
}


В итоге получаю подпись в кодировке Base64 длиной 1448 байт/символов
Вопрос в том какие особенности работы CAdESCOM по сравнению с JCP что получаются настолько разные результаты? И как сделать так, чтобы результаты стали "походить" (извините за недотермин) друг на друга?

p.s. Еще одно наблюдение (хотя может быть и не важное):
Если взглянуть на поле Signers объекта oSignedData после вызова метода oSignedData.SignCades(...), то в нем будет содержаться как минимум один "подписчик", а если получить массив подписчиков у объекта cadesSignature после вызова метода cadesSignature.close() (cadesSignature.getCAdESSignerInfos()), будет пустой массив.
Тоже интересно, почему?

Заранее благодарю за ответ!

Отредактировано пользователем 7 ноября 2018 г. 20:19:47(UTC)  | Причина: Не указана

Offline maximkosheev  
#2 Оставлено : 7 ноября 2018 г. 19:03:07(UTC)
maximkosheev

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

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

Сказал(а) «Спасибо»: 4 раз
Да, забыл уточнить...
Данные которые пытаюсь подписать в обоих случаях одинаковые: строка в формате Base64: MTAvMjAvMjAxOCAxNzozNDoyMw==
Едиственное, что в java предварительно (перед подписыванием) декодирую в массив байт в формате UTF-8

Да, подписи не будут тождественно равны - это понятно. Но почему же они настолько разные? Подписывая эту "строку" плагином n-раз, я получал n-раз разную подпись (я имею ввиду сами байты в подписи), но всегда это была последовательность из 4696 байт с одинаковыми начальными n-байтами.
Offline Евгений Афанасьев  
#3 Оставлено : 7 ноября 2018 г. 19:06:46(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
По поводу размера подписи - если тип подписи один и тот же, то дело, скорее всего, в сертификате/цепочке сертификатов, которую cadescom может по умолчанию помещать в подпись. Это же можно сделать с помощью cades.jar, у cadessignature есть методы добавления сертификатов в подпись.
После создания, чтобы увидеть подписантов, надо декодировать подпись.
Offline maximkosheev  
#4 Оставлено : 7 ноября 2018 г. 21:01:44(UTC)
maximkosheev

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

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

Сказал(а) «Спасибо»: 4 раз
Да, подписи и там и там одинаковые CADES_BES

Код:

Message = oSignedData.SignCades(Signer, [b]CADES_BES[/b], True)


Код:

cadesSignature.addSigner(config.getProviderName(),config.getPrivateKey(), config.getChain(), [b]CAdESType.CAdES_BES[/b], null, true);


Цитата:

Это же можно сделать с помощью cades.jar, у cadessignature есть методы добавления сертификатов в подпись.


Получилось добавить сертификат подписи. Ситуация немного улучшилась, но еще не до конца. Размер подписи JCP по-прежнему немного меньше (на 72 байта/символа). Может быть CADESCOM по умолчанию еще что-то добавляет?

И еще отличие CADESCOM от JCP:
В подписи от CADESCOM в формате base64 начало всегда такое (в моем случае) "MIINvgYJKoZIhvcNAQcCoIIN..."
А в подписи от JCP в формате base64 начало всегда такое (в моем случае) "MIAGCSqGSIb3DQEHAqCAMIAC..."
Offline Евгений Афанасьев  
#5 Оставлено : 7 ноября 2018 г. 21:04:16(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Да, может еще добавлять signingTime.
Offline maximkosheev  
#6 Оставлено : 7 ноября 2018 г. 21:16:14(UTC)
maximkosheev

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

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

Сказал(а) «Спасибо»: 4 раз
Добавил signingTime атрибут в подпись. Теперь размер совпал ровно 4696 байт, как и в случае с CADESCOM.
Но вот как быть с с самой подписью, я имею ввиду содержимым. Вот с этой частью
[qoute]
И еще отличие CADESCOM от JCP:
В подписи от CADESCOM в формате base64 начало всегда такое (в моем случае) "MIINvgYJKoZIhvcNAQcCoIIN..."
А в подписи от JCP в формате base64 начало всегда такое (в моем случае) "MIAGCSqGSIb3DQEHAqCAMIAC..."

Т.е. подписи настолько сильно отличаются, что base64 дает такие разные значения? Или как?
Offline Евгений Афанасьев  
#7 Оставлено : 7 ноября 2018 г. 21:17:40(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Могут отличаться правила кодирования информации (asn) - с длиной или без длины.
Offline maximkosheev  
#8 Оставлено : 7 ноября 2018 г. 21:30:14(UTC)
maximkosheev

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

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

Сказал(а) «Спасибо»: 4 раз
Спасибо, за оперативные ответы!
А можно как-то мне привести их к единообразию?
Offline cross  
#9 Оставлено : 8 ноября 2018 г. 12:22:38(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
А зачем вам что бы совпадали способы кодирования ASN1? Оба варианта полностью валидны и принимаются для проверки как плагином так и JCP.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline maximkosheev  
#10 Оставлено : 8 ноября 2018 г. 22:09:02(UTC)
maximkosheev

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

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

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