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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
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,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Спросите разработчика 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,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
выложите подписанный 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,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Этот pdf не проверяется и iTextoм.
Знания в базе знаний, поддержка в техподдержке
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.