Статус: Активный участник
Группы: Участники
Зарегистрирован: 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-м. Что не так?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Здравствуйте. Автор: auglov ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif) 2012 CAdES-T - складывается впечатление, что эта подпись портит проверку. Она в паре с кем-то идет в одной подписи (sign1 или sign2) или одна? Попробуйте сделать то же самое, но расширять список подписантов не в sign1, а sign2. И приложите, пожалуйста, сформированные сообщения (проверяющееся и непроверяющееся) и логи в ходе проверки (JCPLogger с уровнем ALL). |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.12.2014(UTC) Сообщений: 76
Сказал(а) «Спасибо»: 3 раз
|
Вот даже пример проще собрал. 2001 T + 2012 T. От перестановки порядка объединения ничего не меняется. ![](/forum2/Themes/soclean/icon_file.gif) _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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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);
И результат теперь получается какой нужно. ![](/forum2/Themes/soclean/icon_file.gif) 3.rar (21kb) загружен 3 раз(а).
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Да, теперь все сертификаты (и CRL) объединены, но, возможно, могут быть повторяющиеся сертификаты. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.12.2014(UTC) Сообщений: 76
Сказал(а) «Спасибо»: 3 раз
|
Могут. На проверку ЭП потом не влияют - проверил. По-хорошему, конечно надо убирать для экономии объемов.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close