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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline auglov  
#1 Оставлено : 20 декабря 2017 г. 20:04:52(UTC)
auglov

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

Группы: Участники
Зарегистрирован: 25.12.2014(UTC)
Сообщений: 76

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

Делаю такую штуку: выпускаю себе два тестовых сертификата на разные ГОСТ-ы, 2001 и 2012 и подписываю ими один и тот же документ. Затем пробую собрать результат в один пакет. Примерно так:

Код:

byte[] sign1 = ...; // Тут уже может быть несколько ЭП в одном сообщении. 
byte[] sign2 = ...; // Тут, для простоты, всегда одна ЭП

CAdESSignature cs = new CAdESSignature(new ByteArrayInputStream(sign1), null, null);
cs.verify(null); // Тут OK
CAdESSignature cs2 = new CAdESSignature(new ByteArrayInputStream(sign2), null, null);
cs2.verify(null); // Тут OK

Collection<SignerInformation> updatedSignerInfos = new ArrayList<SignerInformation>();
CAdESSigner[] signers = cs.getCAdESSignerInfos();
for (CAdESSigner signer : signers) {
    updatedSignerInfos.add(signer.getSignerInfo());
}
CAdESSigner[] signers2 = cs2.getCAdESSignerInfos();
for (CAdESSigner signer : signers2) {
    updatedSignerInfos.add(signer.getSignerInfo());
}

SignerInformationStore dstSignerInfoStore = new SignerInformationStore(updatedSignerInfos);
ByteArrayOutputStream newCMSSignedDataBuffer = new ByteArrayOutputStream();
CAdESSignature.replaceSigners(new ByteArrayInputStream(sign1), dstSignerInfoStore, newCMSSignedDataBuffer);

byte[] result = newCMSSignedDataBuffer.toByteArray();

// Контрольная проверка:
CAdESSignature csF = new CAdESSignature(new ByteArrayInputStream(result), null, null);
csF.verify(null); // Вот тут все плохо бывает. Например ru.CryptoPro.CAdES.exception.CAdESException: Certificate: sn ...  not found


Замечено, что если все подписи улучшены заранее до XLong1, то все работает замечательно. Если все сделаны по одному ГОСТ-у, то тоже нормально. Если не все улучшены, то результат не предсказуем. Например,
2001 XLong1 + 2001 CAdES-T + 2012 XLong1 - OK,
2001 XLong1 + 2001 CAdES-T + 2012 XLong1 + 2012 CAdES-T - Fail.
2001 XLong1 + 2001 CAdES-T + 2012 XLong1 + 2001 CAdES-T - OK.
2001 XLong1 + 2001 CAdES-T + 2012 XLong1 + 2001 CAdES-T + 2012 CAdES-T - Fail.

Смотрел в отладчике, signerCertificateChain для провальной подписи пустая бывает в csF. При этом в signatureCertificates есть "неправильные" сертификаты с 2001-м ГОСТ-ом, а должны быть с 2012-м.

Что не так?
Offline Евгений Афанасьев  
#2 Оставлено : 21 декабря 2017 г. 9:25:41(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 715 раз в 675 постах
Здравствуйте.
Автор: auglov Перейти к цитате
2012 CAdES-T
- складывается впечатление, что эта подпись портит проверку. Она в паре с кем-то идет в одной подписи (sign1 или sign2) или одна? Попробуйте сделать то же самое, но расширять список подписантов не в sign1, а sign2. И приложите, пожалуйста, сформированные сообщения (проверяющееся и непроверяющееся) и логи в ходе проверки (JCPLogger с уровнем ALL).

Offline auglov  
#3 Оставлено : 21 декабря 2017 г. 13:36:52(UTC)
auglov

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

Группы: Участники
Зарегистрирован: 25.12.2014(UTC)
Сообщений: 76

Сказал(а) «Спасибо»: 3 раз
Вот даже пример проще собрал. 2001 T + 2012 T. От перестановки порядка объединения ничего не меняется.

_test_merge.rar (27kb) загружен 3 раз(а).

PS: наверное, это не так важно, но обозначу. В коде выше я показал, что подпись у меня присоединенная, но на самом деле нет. На самом деле там вот так еще есть:

Код:

byte[] data = ... // исходный файл, в примере это 3.jpg
new CAdESSignature(new ByteArrayInputStream(sign1), new ByteArrayInputStream(data), null);

Отредактировано пользователем 21 декабря 2017 г. 13:42:19(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 21 декабря 2017 г. 13:43:46(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 715 раз в 675 постах
Спасибо, проверю.
Offline auglov  
#5 Оставлено : 9 января 2018 г. 14:49:38(UTC)
auglov

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

Группы: Участники
Зарегистрирован: 25.12.2014(UTC)
Сообщений: 76

Сказал(а) «Спасибо»: 3 раз
Спасибо, кажется, достаточно дописать вот такой код по дополнительному объединению сертификатов и CRL в обном сообщении:


Код:

            byte[] result = ....; // это вот чем пример исходный закончился - объединением подписантов. 
            CMSSignedData signedData = new CMSSignedData(result);
            
            List certs = new ArrayList<Certificate>();
            certs.addAll(cs.getCertificateStore().getMatches(null));
            certs.addAll(cs2.getCertificateStore().getMatches(null));

            List crls = new ArrayList<Certificate>();
            crls.addAll(cs.getCrlStore().getMatches(null));
            crls.addAll(cs2.getCrlStore().getMatches(null));

            signedData = CMSSignedData.replaceCertificatesAndCRLs(signedData, new CollectionStore(certs), null, new CollectionStore(crls));
            result = signedData.getEncoded();

            // Теперь все ОК:
            CAdESSignature csF = new CAdESSignature(new ByteArrayInputStream(result), null, null);
            csF.verify(null);


И результат теперь получается какой нужно.
3.rar (21kb) загружен 3 раз(а).
Offline Евгений Афанасьев  
#6 Оставлено : 9 января 2018 г. 15:30:18(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 715 раз в 675 постах
Да, теперь все сертификаты (и CRL) объединены, но, возможно, могут быть повторяющиеся сертификаты.
Offline auglov  
#7 Оставлено : 9 января 2018 г. 15:56:12(UTC)
auglov

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

Группы: Участники
Зарегистрирован: 25.12.2014(UTC)
Сообщений: 76

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