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

Уведомление

Icon
Error

6 Страницы123>»
Опции
К последнему сообщению К первому непрочитанному
Offline Алексей 111  
#1 Оставлено : 22 января 2013 г. 11:11:14(UTC)
Алексей 111

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

Группы: Участники
Зарегистрирован: 26.09.2012(UTC)
Сообщений: 57
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 1 раз в 1 постах
Добрый день!

(к сожалению, подсветку синтаксиса не получилось сделать. когда я вставлял code=java с квадратными скобками - часть текста пропадала :(

Пытаюсь реализовать работу с ЭЦП с помощью CAdES.
Возникли такие вопросы:

1) В примере SignExample создается присоединенная подпись:

CAdESSignature cadesSignature = new CAdESSignature(false);
cadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_X_Long_Type_1, Configuration.TSA_ADDRESS);
byte[] cadesCms = cadesSignature.sign(data);


А как мне создать отсоединенную?

И как мне её потом проверить? Подозреваю, что в конструкторе CAdESSignature нужно будет 2-ым параметром передавать данные, которые подписывались. Я прав?

CAdESSignature cadesSignature = new CAdESSignature(signature, data, null);

2) Есть ли возможность подписывать/проверять не массив байт, а поток данных (InputStream)?

3) Есть подозрения, что в примере VerifyExample строка Configuration.loadConfiguration(chain) лишняя:

Collection<X509Certificate> chain = new ArrayList<X509Certificate>();
//Configuration.loadConfiguration(chain);

byte[] cadesCms = Array.readFile(Configuration.TEST_DIR + Configuration.SIGNATURE_FILENAME);

CAdESSignature cadesSignature = new CAdESSignature(cadesCms, null, null);
cadesSignature.verify(chain);


я прав? иначе не понятно, зачем при проверке указывать хранилище, ключ и пароль...

4) Мне нужно к существующему подписанному файлу добавить ещё одного подписанта, правильно ли я делаю?

Collection<X509Certificate> chain = new ArrayList<X509Certificate>();
Configuration.loadConfiguration(chain);
CAdESSignature cadesSignature = new CAdESSignature(data, null, null);
cadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_X_Long_Type_1, CMStools.TSA_ADDRESS);
byte[] cadesCms = cadesSignature.sign(data);


здесь data - это данные уже ранее совмещенные с 1-ой подписью.
Offline Евгений Афанасьев  
#2 Оставлено : 22 января 2013 г. 12:31:33(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 712 раз в 673 постах
Здравствуйте.
1) В конструкторе CAdESSignature первый параметр false - это и есть detached (см. javadoc-документацию).
2) Возможности подписать/проверить поток пока нет.
3) Configuration обобщает операции с ключом и сертификатами. например, в примере подписи loadConfiguration не только получает цепочку из контейнера, но и возвращает закрытый ключ. При проверке это не нужно, может понадобиться только цепочка. Предполагается, что для выполнения примера есть контейнер с ключом и сертификатом.
4) Примерно так:

Код:


    // 1. Декодирование и проверка исходной подписи с одним-двумя
    // подписантами.

    // Читаем существующую подпись из файла.
    byte[] existSign = Array.readFile(Configuration.TEST_DIR +
        Configuration.SIGNATURE_FILENAME);

    CAdESSignature existCadesSignature = new CAdESSignature(existSign, null, null);

    // Список CRL.
    List<X509CRL> crlList = null;

    // Если задан CRL, то читаем его из файла.
    if (Configuration.CRL_FILENAME != null) {

        X509CRL crl = (X509CRL) CertificateFactory.getInstance("X.509")
            .generateCRL(new FileInputStream(Configuration.CRL_FILENAME));

        crlList = Collections.singletonList(crl);
        existCadesSignature.verify(chain, crlList);

    } else {
        existCadesSignature.verify(chain);
    }

    // 2. Получение списка подписантов (1-2 шт.) из исходной
    // подписи.

    // Список всех подписантов в исходной подписи.
    Collection<SignerInformation> existSignerInfos = new ArrayList<SignerInformation>();

    for (CAdESSigner signer : existCadesSignature.getCAdESSignerInfos()) {
        existSignerInfos.add(signer.getSignerInfo());
    }

    // 3. Создаем новую подпись с одним подписантом, которого потом
    // добавим к исходным подписантам. Данные для подписи - те же, на
    // которых создавались исходные подписанты.

    CAdESSignature otherSignerCadesSignature = new CAdESSignature(false);

    // Создаем нового подписанта CAdES-BES.
    otherSignerCadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_BES, null);

    // Подписываем те же данные, что и подписанты из существующей подписи.
    otherSignerCadesSignature.sign(Configuration.DATA);

    // 4. Обновляем список из 1-2 исходных подписантов на новый с новым
    // подписантом.

    CAdESSigner otherSigner = otherSignerCadesSignature.getCAdESSignerInfo(0);

    // Добавляем нового подписанта в список подписантов.
    existSignerInfos.add(otherSigner.getSignerInfo());

    CMSSignedData existCMSSignedData = existCadesSignature.getSignedData();

    // Обновляем исходную подпись c ее начальным списком из 1-2 подписантов
    // на тот же, но + новый подписант. Т.е. стало подписантов на одного больше.
    CMSSignedData newCMSSignedData = CMSSignedData.replaceSigners(existCMSSignedData,
        new SignerInformationStore(existSignerInfos));

    Array.writeFile(Configuration.TEST_DIR + Configuration.SIGNATURE_FILENAME +
        ".plus_new_signer.bin", newCMSSignedData.getEncoded());

    // 5. Проверим новую подпись из 2-3 подписантов.

    // Подпись в тесте была совмещенная, потому данные равны null. Предположим, что
    // подписей несколько, тогда лучше указать тип null и положиться на самоопределение
    // типа подписи.
    CAdESSignature cadesSignature =
        new CAdESSignature(newCMSSignedData.getEncoded(), null, null);

    if (crlList != null) {
        cadesSignature.verify(chain, crlList);
    } else {
        cadesSignature.verify(chain);
    }

    Configuration.printSignatureInfo(cadesSignature);

Отредактировано пользователем 22 января 2013 г. 12:35:15(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Алексей 111 оставлено 22.01.2013(UTC)
Offline Алексей 111  
#3 Оставлено : 23 января 2013 г. 16:33:03(UTC)
Алексей 111

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

Группы: Участники
Зарегистрирован: 26.09.2012(UTC)
Сообщений: 57
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 1 раз в 1 постах
теперь я пытаюсь подписать и проверить подпись с помощью типа CAdES_BES (использую SignExample и VerifyExample)

Collection<X509Certificate> chain = new ArrayList<X509Certificate>();
PrivateKey privateKey = Configuration.loadConfiguration(chain);
CAdESSignature cadesSignature = new CAdESSignature(true);
cadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_BES, null);
byte[] cadesCms = cadesSignature.sign(Configuration.DATA);
Array.writeFile(Configuration.TEST_DIR + Configuration.SIGNATURE_FILENAME, cadesCms);


выполняется успешно



Collection<X509Certificate> chain = new ArrayList<X509Certificate>();
Array.writeFile(Configuration.TEST_DIR + Configuration.SIGNATURE_FILENAME, cadesCms);
CAdESSignature cadesSignature = new CAdESSignature(cadesCms, Configuration.DATA, null);
cadesSignature.verify(chain);


на последней строке вылетает ошибка:

Код:
SEVERE: Certificate Sn 7b7577aa0002000368fd issued by GeneralNames:
    4: E=info@cryptopro.ru,C=RU,O=CRYPTO-PRO,CN=Test Center CRYPTO-PRO
 is not found.


из-за чего такое может быть?
Offline Алексей 111  
#4 Оставлено : 23 января 2013 г. 16:53:05(UTC)
Алексей 111

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

Группы: Участники
Зарегистрирован: 26.09.2012(UTC)
Сообщений: 57
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 1 раз в 1 постах
и ещё, после того, как я установил корневой сертификат у меня перестал работать аплет в браузере
пишет: publisher cannot be verified by a trusted source

аплет я подписываю сгенеренным сертификатом:

keytool -genkey -alias "mycert" -validity 99999 -keystore "c:\Program Files (x86)/java/jre6/lib/security/cacerts"

в этот же keystore я импортировал корневой тестовый сертификат КриптоПро:

keytool -importcert -file certnew.cer -alias cryptopro_ca1 -keystore "c:\Program Files (x86)/java/jre6/lib/security/cacerts"

если корневой сертификат удалить - аплет работает.

как мне сделать, чтобы аплет работал и с импортированным корневым сертификатом?
Offline Евгений Афанасьев  
#5 Оставлено : 23 января 2013 г. 17:06:26(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 712 раз в 673 постах
Автор: Алексей 111 Перейти к цитате

на последней строке вылетает ошибка:

Код:
SEVERE: Certificate Sn 7b7577aa0002000368fd issued by GeneralNames:
    4: E=info@cryptopro.ru,C=RU,O=CRYPTO-PRO,CN=Test Center CRYPTO-PRO
 is not found.


из-за чего такое может быть?


переменная chain в функции verify(chain) пустая или содержит цепочку?

Отредактировано пользователем 23 января 2013 г. 17:07:03(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#6 Оставлено : 23 января 2013 г. 17:09:13(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 712 раз в 673 постах
Автор: Алексей 111 Перейти к цитате
я установил корневой сертификат

Что это за корневой сертификат?

Offline Алексей 111  
#7 Оставлено : 24 января 2013 г. 8:14:21(UTC)
Алексей 111

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

Группы: Участники
Зарегистрирован: 26.09.2012(UTC)
Сообщений: 57
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 1 раз в 1 постах
Автор: afev Перейти к цитате
Автор: Алексей 111 Перейти к цитате
я установил корневой сертификат

Что это за корневой сертификат?


корневой сертификат я взял от сюда: https://www.cryptopro.ru/certsrv/
выбрав "Получить сертификат Удостоверяющего Центра" > "Загрузка сертификата ЦС"
Offline Алексей 111  
#8 Оставлено : 24 января 2013 г. 8:19:51(UTC)
Алексей 111

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

Группы: Участники
Зарегистрирован: 26.09.2012(UTC)
Сообщений: 57
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 1 раз в 1 постах
Автор: afev Перейти к цитате
Автор: Алексей 111 Перейти к цитате

на последней строке вылетает ошибка:

Код:
SEVERE: Certificate Sn 7b7577aa0002000368fd issued by GeneralNames:
    4: E=info@cryptopro.ru,C=RU,O=CRYPTO-PRO,CN=Test Center CRYPTO-PRO
 is not found.


из-за чего такое может быть?


переменная chain в функции verify(chain) пустая или содержит цепочку?


переменная chain - пустая.

если при подписывании использовать тип CAdES_X_Long_Type_1:

Код:
cadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_X_Long_Type_1, Configuration.TSA_ADDRESS);


то проверка работает
Offline Евгений Афанасьев  
#9 Оставлено : 24 января 2013 г. 8:33:55(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 712 раз в 673 постах
Потому что для проверки CAdES-BES нужен клиентский сертификат. В CAdES-X Long Type 1 этот сертификат есть в подписи.
Offline Евгений Афанасьев  
#10 Оставлено : 24 января 2013 г. 8:40:01(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 712 раз в 673 постах
Автор: Алексей 111 Перейти к цитате
publisher cannot be verified by a trusted source

Попробуйте включить логирование.

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