Как Подписать Pdf-Документ На Java С Помощью Криптопро



Как подписать PDF-документ на Java с помощью КриптоПро

Привет! Я сотрудник Альфа-Банка и занимаюсь разработкой программного обеспечения со встроенными средствами криптографической защиты информации.

В этой статье я хочу поговорить о следующих вещах:

преимущества формата PDF как документа с электронной подписью; Платформа Java, библиотека itextpdf и СКЗИ КриптоПро CSP в качестве средств подписи; о трудностях, с которыми нам пришлось столкнуться, о доработке itextpdf; привести пример кода, выполняющего несколько подписей; поговорим о целесообразности использования формата PDF в качестве документа с подписью.

В современном информационном мире важность электронной подписи и основных услуг, которые она предоставляет (сохранность данных и неотказ от авторства), сложно переоценить.

Государственные органы, физические и юридические лица широко используют электронные подписи в потоках обмена информацией между собой.

Согласно закону, электронная подпись может придавать документам юридическую силу, равную по значимости бумажному носителю, подписанному собственноручной подписью и скрепленному печатью уполномоченного лица.



Преимущества PDF

В качестве контейнера для хранения разнообразной информации в удобном для человека формате формат PDF по праву завоевал свою популярность.

Его можно открыть в любой ОС.

PDF-документ может содержать не только текстовые и табличные данные, но также аудио- и видеозаписи, инженерную графику и трехмерные модели.

Для дополнительной обработки PDF-документов в этом формате предусмотрен такой мощный инструмент, как поддержка JavaScript для изменения содержимого форм и полей при возникновении события или действия пользователя.

Инструменты Adobe Systems (разработчика формата PDF) поддерживают использование электронных подписей.

В отличие от сообщений с прикрепленной стойкой электронной подписью стандарта PKCS#7 и его расширения CAdES, для просмотра PDF-документа с подписью не требуется никакого дополнительного специального программного обеспечения.

За исключением поставщика шифрования, который необходим во всех случаях.

Те.

Инструменты Adobe позволяют визуализировать электронную подпись в документе.

При подписании PDF-документа вы можете задать параметры визуализации, указать номер страницы, размер блока с подписью, название поля, где ее разместить, добавить графическое изображение, например, логотип компании, скан.

собственноручной подписи руководителя и печати организации.

При просмотре таких документов, помимо визуализации в теле документа, Acrobat и Adobe Reader отображают вкладку «Подписи» с сопутствующей информацией: значком, показывающим статус проверки подписи, информацию о том, был ли документ изменен, результат проверки.

проверка сертификата открытого ключа, время последней проверки, страница и поле, содержащие электронную подпись.



Инструменты для подписи

Используемая версия Java: «1.8.0_111» HotSpot(TM) 64-разрядная серверная виртуальная машина (сборка 25.111-b14).

В качестве сертифицированного средства защиты информации от лицензированного разработчика мы используем криптопровайдер КриптоПро CSP v4.0 и КриптоПро JCP – v.2.0, с установкой модуля КриптоПро Java CSP v.4.0. Почему КриптоПро JCP – v.2.0, с модулем КриптоПро Java CSP v.4.0? Потому что провайдер КриптоПро JCP после длительного безсертификационного периода получил сертификат соответствия от регулятора до 31 декабря 2018 года, а затем, по информации разработчика, снова может возникнуть неопределенность с сертификацией.

Модуль КриптоПро Java CSP v.4.0 не выполняет криптографические преобразования и по сути является API к провайдеру КриптоПро CSP, к очередной сертификации которого вопросов нет. Здесь нужно сказать, что действующий сертификат СКЗИ не требуется при условии использования криптопровайдера исключительно для внутренних целей.

Согласно спецификации Java Cryptography Architecture (JCA), в своем приложении я указываю и использую функции поставщика криптографии: JCSP. После установки КриптоПро этот провайдер отображается в списке всех доступных в файле .

/java/jdk1.8.x_xxx/jre/lib/security/java.security, где можно настроить, какой из них предпочтительнее использовать по умолчанию, если это явно не указано в заявке:

   

# # List of providers and their preference orders (see above): # security.provider.1=ru.CryptoPro.JCSP.JCSP

Не забывайте, что экспортные ограничения платформы Java, которые блокируют работу криптопровайдеров с российскими алгоритмами шифрования, должны быть сняты.

Для этого вам необходимо заменить файлы в .

/java/jdk1.8.x_xxx/jre/lib/security. local_policy.jar И US_export_policy.jar тем, которые представлены по адресу: Расширение криптографии Java (JCE) Файлы политики юрисдикции неограниченной силы 8 Скачать и содержащийся в default_local.policy И default_US_export.policy :

grant { // There is no restriction to any algorithms. permission javax.crypto.CryptoAllPermission; };

Использование библиотеки iText itextpdf.com для работы с PDF-документами на Java было продиктовано провайдером КриптоПро.

КриптоПро JCP включает файл исправления Git для библиотеки iTextpdf версии 5.1.3 — jcp-2.0.xxxxxx\Doc\itextpdf\ itextpdf_5.1.3.gost.user.patch

Как подписать PDF-документ на Java с помощью КриптоПро

Патч адаптирует itextpdf для работы с провайдером КриптоПро.

Вам необходимо скачать исходный код библиотеки версии 5.1.3, затем использовать командную строку Bash системы контроля версий Git для применения патча: git apply --stat itextpdf_5.1.3.gost.user.patch

Как подписать PDF-документ на Java с помощью КриптоПро

Далее вам необходимо собрать полученную библиотеку из обновлённого исходного кода и подключить её к приложению.

В рамках КриптоПро JCP вы можете найти множество примеров в файле образцы-sources.jar .

В частности, есть примеры подписания и проверки PDF-документов.

(\PDF\SignVerifyPDFExample.java).



Проблемы и трудности сборки

После успешного обновления исходного кода itextpdf в нем появляются зависимости для пакетов ru.CryptoPro.JCP и ru.CryptoPro.reprov.x509. Без них проект с исходным кодом itextpdf_5.1.3.gost не будет собран.



[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project itextpdf: Compilation failure: Compilation failure: [ERROR] \github\iTextpdf_5.1.3_patched_cryptopro_bc1.50\src\main\java\com\itextpdf\text\pdf\PdfPKCS7.java:[138,23] error: package ru.CryptoPro.JCP does not exist [ERROR] \github\iTextpdf_5.1.3_patched_cryptopro_bc1.50\src\main\java\com\itextpdf\text\pdf\PdfPKCS7.java:[139,31] error: package ru.CryptoPro.reprov.x509 does not exist

Вам необходимо взять файлы JCP.jar и JCPRevTools.jar из дистрибутива КриптоПро 2.0 и поместить их в каталог JRE, который использует Maven: Java\jdk1.8.0_111\jre\lib\ext. Конечно, они также должны быть в classPath приложения.

Итак, библиотека собрана, давайте подключим ее к приложению.

И здесь возникает основная проблема.

iTextpdf_5.1.3 содержит зависимость от Bouncy Castle версии 1.46, библиотеки с открытым исходным кодом, которая реализует поставщика шифрования и поддерживает структуры ASN.1.

<dependency>

Теги: #java #pdf #электронная подпись #криптопро #криптопровайдер #Криптография #PKI #цифровая подпись #информационная безопасность #цифровая безопасность #цифровая безопасность #открытый ключ #инфраструктура открытых ключей #Синтаксис криптографического сообщения #CAdES #pkcs7 #информационная безопасность #Криптография # Java #pdf

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.