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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline LucidLynx  
#1 Оставлено : 6 июля 2012 г. 20:55:41(UTC)
LucidLynx

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

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

Я подписываю PDF с помощью iText следующим кодом:
Цитата:

Certificate[] chain = new Certificate[] {certificate};
PdfReader reader = new PdfReader(pdf);
ByteArrayOutputStream out = new ByteArrayOutputStream();
PdfStamper stp = PdfStamper.createSignature(reader, out, '\0');
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setCrypto(privateKey, chain, null, PdfName.ADOBE_CryptoProPDF);
sap.setReason("I'm the author");
sap.setLocation("Lisbon");
sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null);
stp.close();

Потом out записываю в файл и открываю в Adobe Reader с плагином КриптоПро PDF. Он подпись видит, но говорит, что она невалидна и документ был изменен с момента подписи.
UserPostedImage
Когда я делаю тоже самое, но беру сертификат из самодельного JKS-хранилища (файла) с RSA-алгоритмом, то все нормально работает.
В чем может быть проблема?

P.S. Когда из JKS-хранилища беру сертификат, то там он самоподписанный, а когда из КриптоПро, то у него еще есть корневой сертификат в цепочке. Но в случае с сертификатом ГОСТ с помощью плагина КриптоПро PDF видно, что цепочка валидна.

Отредактировано пользователем 6 июля 2012 г. 20:57:29(UTC)  | Причина: Не указана

Offline Ivanov-aa  
#2 Оставлено : 9 июля 2012 г. 22:06:50(UTC)
Ivanov-aa

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

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

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 38 раз в 36 постах
Offline LucidLynx  
#3 Оставлено : 23 июля 2012 г. 13:23:39(UTC)
LucidLynx

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

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

Одна из ссылок описывает проблему с C#, а у меня Java и мне не понятно как это соотнести со своим кодом. По второй ссылке обсуждается, что надо пропатчить iText. Я это сделал и описанная выше ситуация получается от пропатченной библиотеки iText. Есть еще какие-то варианты, почему с RSA всё работает, а с ГОСТ — нет?
Offline LucidLynx  
#4 Оставлено : 23 июля 2012 г. 17:23:33(UTC)
LucidLynx

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

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

Скажите, пожалуйста, чем отличаются эти два способа подписи PDF?
Первый:
Цитата:

private byte[] sign(byte[] pdf, Certificate certificate, PrivateKey privateKey) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, DocumentException, XmlDSignException, InternalCryptoException {
Certificate[] chain = new Certificate[] {certificate};

PdfReader reader = new PdfReader(pdf);
ByteArrayOutputStream out = new ByteArrayOutputStream();
PdfStamper stp = PdfStamper.createSignature(reader, out, '\0');
PdfSignatureAppearance sap = stp.getSignatureAppearance();

sap.setCrypto(privateKey, chain, null, PdfName.ADOBE_CryptoProPDF);
sap.setReason("I'm the author");
sap.setLocation("Lisbon");
// comment next line to have an invisible signature
sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null);
stp.close();

return out.toByteArray();
}


Второй:
Цитата:

private byte[] a(byte[] pdf, X509Certificate certificate, PrivateKey privateKey) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, DocumentException, XmlDSignException, InternalCryptoException, CryptoDataException {
PdfReader reader = new PdfReader(pdf);
ByteArrayOutputStream out = new ByteArrayOutputStream();
PdfStamper st = PdfStamper.createSignature(reader, out, '\0');

PdfSignatureAppearance sap = st.getSignatureAppearance();

X509Certificate[] chain = new X509Certificate[] {certificate};

sap.setCrypto(null, chain, null, null);
sap.setReason("I like to sign");
sap.setLocation("Universe");
sap.setAcro6Layers(true);
sap.setRender(PdfSignatureAppearance.SignatureRenderNameAndDescription);
sap.setSignDate(new GregorianCalendar());

// Выбираем подходящий тип фильтра
PdfName filterName = new PdfName("CryptoPro#20PDF");

// Создаем подпись
PdfSignature dic = new PdfSignature(filterName, PdfName.ADBE_PKCS7_DETACHED);
dic.setDate(new PdfDate(sap.getSignDate()));
dic.setName(PdfPKCS7.getSubjectFields(chain[0]).getField("CN"));
if (sap.getReason() != null) {
dic.setReason(sap.getReason());
}
if (sap.getLocation() != null) {
dic.setLocation(sap.getLocation());
}
sap.setCryptoDictionary(dic);

int intCSize = 100000;
HashMap<PdfName, Integer> hashtable = new HashMap<PdfName, Integer>();
hashtable.put(PdfName.CONTENTS, intCSize * 2 + 2);
sap.preClose(hashtable);

// Вычисляем подпись

byte[] pk = cryptoService.signData(IOUtils.toByteArray(sap.getRangeStream()), certificate.getEncoded(), null, null);

// Помещаем подпись в документ
PdfDictionary dic2 = new PdfDictionary();
byte[] outc = Arrays.copyOf(pk, pk.length);
dic2.put(PdfName.CONTENTS, new PdfString(outc).setHexWriting(true));
sap.close(dic2);

return out.toByteArray();
}

Используется алгоритм ГОСТ. Первый способ не проверяется потом в Java-коде и Adobe Reader с плагином говорит, что SIGNATURE INVALID. Второй способ успешно проверяется в Java-коде, но Adobe Reader пишет, что подпись требует валидации, жму проверку, он предлагает выбрать обработчик, выбираю и получаю ошибку:
Цитата:
Error during signature verification.

Signature contains incorrect, unrecognized, corrupted or suspicious data.
Support Information: SigDict /Contents illegal data

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

Offline Максим Коллегин  
#5 Оставлено : 23 июля 2012 г. 18:08:19(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,064
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 604 раз в 541 постах
Спросите разработчика iText - у них очень скудная документация. В КриптоПро .NET SDK входит рабочий пример для последнего iTextSharp, ничего патчить не нужно.
Знания в базе знаний, поддержка в техподдержке
Offline LucidLynx  
#6 Оставлено : 23 июля 2012 г. 20:57:11(UTC)
LucidLynx

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

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

Скачал КриптоПро .NET SDK, взял оттуда пример Siple35.2010. Запускаю так:
Цитата:
Simple35CS.exe Pdf.Sign not_signed.pdf "тут имя сертификата (DN)"

В ответ он мне говорит: System.ArgumentException: Длина результирующего массива недостаточна. Проверьте значения destIndex и length, а также нижние границы массива.
Подебажив я выяснил, что размер массива byte[] outc слишком мал: 4000 байт. Написал туда 600 кб, ошибка исчезла, но появилась другая: System.ArgumentException: The key /Contents is too big. Is 1200002, reserved 8002. Там выше какой-то другой массив есть, я сделал его размер такой же, как и outc: 600 кб и документ подписался. Adobe Reader подпись видит, но говорит, что она недействительна. Почему так и что делать?
Offline Максим Коллегин  
#7 Оставлено : 23 июля 2012 г. 21:46:44(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,064
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 604 раз в 541 постах
выложите подписанный pdf.
Знания в базе знаний, поддержка в техподдержке
Offline LucidLynx  
#8 Оставлено : 24 июля 2012 г. 13:04:41(UTC)
LucidLynx

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

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

Подписанный pdf

Отредактировано пользователем 24 июля 2012 г. 13:06:31(UTC)  | Причина: Не указана

Offline LucidLynx  
#9 Оставлено : 24 июля 2012 г. 15:09:10(UTC)
LucidLynx

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

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

Как сделать, чтобы Sign.cs из проекта Siple35.2010 создавал подпись, которая успешно провалидируется Adobe Reader-ом?
Offline Максим Коллегин  
#10 Оставлено : 24 июля 2012 г. 16:05:21(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,064
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 604 раз в 541 постах
Этот pdf не проверяется и iTextoм.
Знания в базе знаний, поддержка в техподдержке
Offline LucidLynx  
#11 Оставлено : 24 июля 2012 г. 16:53:05(UTC)
LucidLynx

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

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

Этот возможно. Я сделал его с помощью примера из КриптоПро .NET SDK всего лишь изменив размерность массивов, чтобы оно вообще работало. Поэтому мне непонятно почему оно не проверяется. Примеры в КриптоПро .NET SDK сделаны с ошибками?
PDF, который проверяется iText-ом и сделан моим кодом на Java. (Вторым способом из поста выше.) Но в Adobe Reader он не проверяется почему-то.

Отредактировано пользователем 24 июля 2012 г. 16:56:36(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#12 Оставлено : 24 июля 2012 г. 17:21:02(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,064
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 604 раз в 541 постах
У нас пример работает из SDK работает.
А почему получается такой большой pdf?
Знания в базе знаний, поддержка в техподдержке
Offline LucidLynx  
#13 Оставлено : 24 июля 2012 г. 18:56:27(UTC)
LucidLynx

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

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

Такой большой получился от того, что я создал массивы размером побольше... Чтобы не падало. Видимо весь массив пишется в файл. Кстати, может быть у меня примеры без изменения размера массивов не работают, потому что у меня 64 битная ОС?
В исходном примере в строке Array.Copy(pk, 0, outc, 0, pk.Length); ошибка. Размер массива pk.Length = 4004, а outc создается длиной 4000. Скриншот прилагать, надеюсь не нужно. Отчего так получается?

Отредактировано пользователем 24 июля 2012 г. 19:11:29(UTC)  | Причина: Не указана

Offline LucidLynx  
#14 Оставлено : 24 июля 2012 г. 19:28:08(UTC)
LucidLynx

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

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

Можете мне дать для примера PDF, подписанный по ГОСТ-у, который успешно проверяется и в iText, и в Adobe Reader?
Offline Максим Коллегин  
#15 Оставлено : 24 июля 2012 г. 19:51:46(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,064
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 604 раз в 541 постах
Вложил. Файл сделан примером из SDK.
Вложение(я):
test.pdf_signed.pdf (88kb) загружен 33 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Знания в базе знаний, поддержка в техподдержке
Offline LucidLynx  
#16 Оставлено : 24 июля 2012 г. 20:08:29(UTC)
LucidLynx

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

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

Да, он успешно проверяется и Adobe Reader-ом и методами iText. Но непонятно, чем мой файл не такой...
Offline demin alexey 2021  
#17 Оставлено : 20 мая 2021 г. 10:47:23(UTC)
demin alexey 2021

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

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

Сказал(а) «Спасибо»: 1 раз
Здравствуйте, можно увидеть решение?


Автор: LucidLynx Перейти к цитате
Да, он успешно проверяется и Adobe Reader-ом и методами iText. Но непонятно, чем мой файл не такой...


Offline Андрей *  
#18 Оставлено : 20 мая 2021 г. 11:35:17(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,311
Мужчина
Российская Федерация

Сказал «Спасибо»: 380 раз
Поблагодарили: 1528 раз в 1175 постах
Автор: demin alexey 2021 Перейти к цитате
Здравствуйте, можно увидеть решение?


Автор: LucidLynx Перейти к цитате
Да, он успешно проверяется и Adobe Reader-ом и методами iText. Но непонятно, чем мой файл не такой...




Выше же написано - в SDK (к КриптоПРО.NET) есть пример.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.