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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline test.user  
#1 Оставлено : 11 июля 2023 г. 11:29:44(UTC)
test.user

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

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

Сказал(а) «Спасибо»: 11 раз
Добрый день, используем JCP 2.0.41940-A для подписи pdf с визуализацией подписи через библиотеку itextpdf-5.5.5-patched.jar из состава JCP.
Код очень похож на пример из samples.jar:
Код:

PdfReader reader = new PdfReader("test_in.pdf");
			FileOutputStream fout = new FileOutputStream("test_out.pdf");

			PdfStamper stp = false //не добавляем подписи, всегда новая
					? PdfStamper.createSignature(reader, fout, '\0', null, true)
					: PdfStamper.createSignature(reader, fout, '\0');

			PdfSignatureAppearance sap = stp.getSignatureAppearance();
			sap.setReason("test");
			sap.setLocation("MSK");
			sap.setCertificate(cert); // серт которым подписываем

			FileInputStream fis = new FileInputStream("scr.png"); //чтение картинки которая будет добавлена в подпись для визуализации
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			byte[] buf = new byte[1024];
			int n = 0;
			while ((n = fis.read(buf, 0, buf.length)) != -1) {
				baos.write(buf, 0, n);
			}
			fis.close();
			byte[] im = baos.toByteArray();
			Image image = Image.getInstance(im);
			sap.setImage(image);
			sap.setVisibleSignature(new Rectangle(150, 150), 1, null);

			PdfSignature dic = new PdfSignature(PdfName.ADOBE_CryptoProPDF, PdfName.ADBE_PKCS7_DETACHED); // не уверен что тут правильные значения

			dic.setReason(sap.getReason());
			dic.setLocation(sap.getLocation());
			dic.setSignatureCreator(sap.getSignatureCreator());
			dic.setContact(sap.getContact());
			dic.setDate(new PdfDate(sap.getSignDate())); // time-stamp will over-rule this

			sap.setCryptoDictionary(dic);
			int estimatedSize = 8192 * 4; // пришлось увеличить это значение, если в цепочку добавлять все серты, но с одним сертификатом проблема такая же

			HashMap<PdfName, Integer> exc = new HashMap<PdfName, Integer>();
			exc.put(PdfName.CONTENTS, new Integer(estimatedSize * 2 + 2));

			sap.preClose(exc);

			PdfPKCS7 sgn = new PdfPKCS7(privateKey, chain,
					JCP.GOST_DIGEST_2012_256_NAME, JCP.PROVIDER_NAME, null, false);

			InputStream stream = sap.getRangeStream();
			MessageDigest md = MessageDigest.getInstance(JCP.GOST_DIGEST_2012_256_NAME);
			byte hash[] = DigestAlgorithms.digest(stream, md);

			Calendar cal = Calendar.getInstance();

			byte[] sh = sgn.getAuthenticatedAttributeBytes(hash, cal,
					null, null, MakeSignature.CryptoStandard.CMS);

			sgn.update(sh, 0, sh.length);
			byte[] encodedSig = sgn.getEncodedPKCS7(hash, cal);

			if (estimatedSize < encodedSig.length) {
				throw new IOException("Not enough space");
			} // if

			byte[] paddedSig = new byte[estimatedSize];
			System.arraycopy(encodedSig, 0, paddedSig, 0, encodedSig.length);

			PdfDictionary dic2 = new PdfDictionary();
			dic2.put(PdfName.CONTENTS, new PdfString(paddedSig).setHexWriting(true));

			sap.close(dic2);
			stp.close();
			fout.close();
			reader.close();


После выполнения кода картинка добавляется на pdf, но signed by пустой - ""(). Дальнейшая проверка подписи также показывает что подпись не выполнена. Пробовали добавлять в chain и только сертификат для privateKey и вообще все сертификаты находящиеся в контейнере, но подпись так и не проставляется. Помогите понять в чем дело пожалуйста.
Offline Евгений Афанасьев  
#2 Оставлено : 12 июля 2023 г. 11:42:03(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Здравствуйте.
А чем вы проверяете? Здесь же с помощью itextpdf?
Offline test.user  
#3 Оставлено : 12 июля 2023 г. 12:12:09(UTC)
test.user

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

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

Сказал(а) «Спасибо»: 11 раз
Да, проверка тоже через itextpdf:
Код:

PdfReader checker = new PdfReader(fileToVerify);
		AcroFields af = checker.getAcroFields();

		ArrayList<String> signatureNames = af.getSignatureNames();
		if (signatureNames.size() == 0) {
			throw new Exception("Signatures not found.");
		} // if


но можно и в самом pdf посмотреть, там также не появляется информации о подписи.
Offline Евгений Афанасьев  
#4 Оставлено : 13 июля 2023 г. 21:43:12(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Попробуйте сначала с тем примером, что в samples-sources.jar: пример PDF/SignVerifyPDFExample
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
test.user оставлено 25.07.2023(UTC)
Offline test.user  
#5 Оставлено : 25 июля 2023 г. 13:52:54(UTC)
test.user

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

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

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