В современной цифровой экономике электронный документооборот (ЭДО) является краеугольным камнем эффективного взаимодействия как между коммерческими организациями, так и с государственными органами. Однако, несмотря на повсеместное внедрение систем ЭДО, существуют специфические процессы – такие как подача регуляторной отчётности, получение лицензий или взаимодействие с определёнными государственными информационными системами – которые выдвигают дополнительные, порой парадоксальные, требования. Одним из таких распространённых требований является необходимость визуализации электронной подписи непосредственно в формате PDF-документа.
Хотя с юридической точки зрения такая визуализация сама по себе не придаёт подписи силы без соответствующего файла контейнера или откреплённой подписи, многие регулирующие органы продолжают настаивать на её наличии. Это создаёт существенную проблему для организаций, поскольку стандартные решения для реализации этой функции часто оказываются экономически неэффективными и логистически обременительными. В настоящей статье мы рассмотрим альтернативный подход к решению этой задачи, основанный на использовании .NET-платформы и сертифицированных средств криптографической защиты информации (СКЗИ), таких как КриптоПро.
Проблема и её текущие решения
Типичное решение для добавления визуальной метки электронной подписи в PDF-документ, предлагаемое на рынке, представлено коммерческими программными продуктами, например, КриптоПро PDF. Несмотря на свою функциональность, стоимость такого программного обеспечения, достигающая нескольких десятков тысяч рублей за одно рабочее место, в совокупности с необходимостью приобретения дополнительных лицензий на СКЗИ КриптоПро, делает его чрезмерно дорогим, особенно для малого и среднего бизнеса. Более того, процесс закупки таких лицензий через посредников зачастую сопряжён с длительными ожиданиями, что негативно сказывается на операционной гибкости компаний. Наблюдаемое стремление крупных компаний приобретать значительные объёмы таких лицензий, имея при этом собственный штат высококвалифицированных разработчиков, вызывает вопросы об оптимальности подобных инвестиций.
Очевидно, что существует потребность в более гибком, контролируемом и, возможно, более экономически выгодном решении, которое не привязывает организацию к дорогостоящим проприетарным продуктам и сложным цепочкам поставок лицензий.
Альтернативный подход: Разработка десктопного решения на C#
Мой профессиональный путь, начавшийся с погружения в программирование на Pascal, Delphi и C++ для решения математических и криптографических задач, сформировал некоторое понимание внутренней работы систем. Этот фундамент оказался полезным и при переходе к разработке на более высокоуровневых языках. Вдохновлённый предыдущим опытом работы с консольными утилитами КриптоПро через PHP-библиотеку CryptoProBuilder, возникла амбициозная идея: создать нативное десктопное приложение для Windows, способное программно добавлять визуализацию подписи в PDF.
Несмотря на некоторую критику документации КриптоПро SDK в предыдущих материалах, детальное изучение его возможностей в контексте C# и .NET Framework, а также знакомство с Windows Forms, быстро подтвердили реализуемость задумки. Это позволило оперативно перейти к проектированию компонентов графического интерфейса. Результатом стал интуитивно понятный и адаптивный интерфейс, который, не претендуя на премию в области дизайна, обеспечивает высокую юзабилити.
Переход от PHP к C# в данном контексте оказался весьма органичным. Наличие доступа к низкоуровневым системным инструментам в C# значительно упростило взаимодействие с КриптоПро SDK.
Архитектура и реализация решения
Суть разработанного решения заключается в эффективной интеграции ключевых компонентов для обеспечения полного цикла работы с PDF-документами и электронной подписью:
Интеграция с PDF-просмотрщиком: Для обеспечения верификации пользователем подписываемого документа, приложение использует встроенный COM-компонент Adobe Reader. Это позволяет отобразить PDF-документ непосредственно в интерфейсе приложения, гарантируя, что подписывается именно тот файл, который предполагался.
Управление сертификатами: После подтверждения документа, пользователь выбирает необходимый сертификат электронной подписи из заранее подгруженного списка. После выбора, приложение мгновенно извлекает и отображает все ключевые свойства выбранного сертификата (владелец, срок действия, издатель, отпечаток и т.д.). Эти данные не только используются для последующей визуализации подписи, но и являются критически важными для самого процесса криптографического подписания.
Конфигурация подписи: Пользователь имеет возможность определить дополнительные параметры подписи, такие как необходимость создания отсоединённой подписи (файл подписи отдельно от документа) и, конечно же, активация функции визуализации подписи в PDF.
Процесс подписания и визуализации: При инициации процесса подписания пользователю предлагается выбрать имя и путь для сохранения нового файла. По умолчанию предлагается имя исходного файла, что требует внимательности во избежание его перезаписи. Ключевым аспектом реализации является последовательность операций:
Подготовка визуализации: На этом этапе формируются все необходимые графические элементы и текстовые данные для визуализации подписи.
Внедрение визуализации: Подготовленные элементы внедряются в PDF-документ. Этот шаг выполняется до криптографического подписания. Это крайне важно, так как любое изменение документа после вычисления его хэш-суммы для подписи приведёт к недействительности самой подписи.
Криптографическое подписание: После модификации PDF-документа для включения визуализации, выполняется процесс его подписания с использованием выбранного сертификата и ранее определённых параметров.
Верификация и расширяемость: По завершении процесса подписания, пользователь имеет возможность немедленно верифицировать целостность и действительность полученных файлов, используя стандартные инструменты КриптоПро.
Архитектура решения закладывает прочную основу для дальнейшего расширения функционала. В будущих итерациях возможно:
Интеграция с почтовыми клиентами для автоматической отправки подписанных документов.
Поддержка различных криптопровайдеров, помимо КриптоПро.
Интеграция с внутренними системами управления документами (ECM) или внешними системами ЭДО через API.
Настройка и кастомизация стилей визуализации подписи (шрифты, расположение, размер, динамическое добавление полей).
Внедрение функций проверки лицензий, что может способствовать формированию более конкурентного рынка решений.
Заключение
Опыт создания подобного решения наглядно демонстрирует, что глубокое понимание принципов работы криптографических систем, в сочетании с гибким использованием современных средств разработки, позволяет создавать мощные и востребованные продукты.
Комментарии (13)
max9
07.07.2025 16:40Опыт создания подобного решения наглядно демонстрирует, что глубокое понимание принципов работы криптографических систем, в сочетании с гибким использованием современных средств разработки, позволяет создавать мощные и востребованные продукты.
не демонстрирует. есть ряд вопросов:
1) есть ли у вас лицензия от ФСБ на крипту?
2) в статье ни слова о ФСТЭК-сертификации решения, никто в здравом уме себе это не поставит, потому что в случае проблем выебут как сидорову козу. причем не вас, а потребителя. и да, я вас огорчу - для сертификации вам понадобится статанализ самого "интерпретатора" дотнет. для одного человека это годы работы, причем не абы каким статанализатором, а рекомендованным ФСТЭК, тоже платным, не будем упоминать всуе его имя.
3) и вы сами это признаете "Хотя с юридической точки зрения такая визуализация сама по себе не придаёт подписи силы без соответствующего файла контейнера или откреплённой подписи "
4) краем глаза пробежался по соседней упоминаемой статье, про php, https://habr.com/ru/articles/924478/. если в дотнет у вас такие же решения
->changeContainerPass($container, currentPass: '', newPass: '1234')
вам кранты - сертификацию и впринципе безопасные методы разработки вы никогда не сдадите
DmitriiMikhailov Автор
07.07.2025 16:40Благодарю за комментарий.
Моя программа не реализует собственную криптографию — все операции выполняются через лицензионный и сертифицированный модуль CryptoPro CSP, который уже одобрен ФСБ. Я использую его официальный SDK и взаимодействую с ним через предусмотренные интерфейсы, в том числе CryptoPro .NET.Таким образом, требования по сертификации от ФСБ/ФСТЭК относятся к криптографическому ядру, а не к надстройкам, использующим его по прямому назначению и в штатном режиме. Это типовой сценарий использования, прямо описанный в документации.
В противном случае SDK просто бы не был публично доступен и не рекомендовался бы к использованию сторонними разработчиками.
Документация и требования к CryptoPro .NET доступны здесь:
https://www.cryptopro.ru/products/netЕсли вы решите разработать своё решение, очень советую с неё начать — SDK даёт достаточно гибкости для создания GUI, автоматизации, интеграции с системами ЭДО и не требует от разработчика получения собственной лицензии на СКЗИ.
max9
07.07.2025 16:40все операции выполняются через лицензионный и сертифицированный модуль CryptoPro CSP
а вот это очень тоненький лед. предположим выхлопы официальных утилит платных и ваших будут отличатся. не в вашу пользу.
Таким образом, требования по сертификации от ФСБ/ФСТЭК относятся к криптографическому ядру, а не к надстройкам, использующим его по прямому назначению и в штатном режиме. Это типовой сценарий использования, прямо описанный в документации
к сожалению по классике по вашей ссылке https://www.cryptopro.ru/products/net на доку https://cpdn.cryptopro.ru/default.asp?url=content/cpnet/html/08bcd27a-1f1c-4494-a996-37d88776309e.htm возвращает 404, возможно необходима авторизация какая-то.
есть более другая ссылка?
PS и да, ваше комментарии прям отдают чат-гопотой.
DmitriiMikhailov Автор
07.07.2025 16:40Вы можете воспользоваться поисковой системой что бы найти КриптоПро .NET и всю необходимую документацию с примерами. Для скачивания официальных дистрибутивов потребуется учетная запись.
Что касается тонкого льда, о котором вы упомянули. Ввод и вывод в данном приложении полностью контролируется и передается напрямую в модуль КриптоПро SDK, который работает по принципу черного ящика — получает ввод, возвращает вывод. Вы не влияете напрямую на криптографические операции, но можете управлять ими согласно официальной документации. Ситуация при которой один и тот же сертифицированный инструмент начнет выдавать разный вывод — лично мне кажется фантастической и не имеющая под собой никаких оснований.
По поводу чата-гопоты — вы вполне можете рассмотреть вариант использования нейросетей что бы закрыть определенные бизнес задачи, я могу только поддержать ваши стремления т.к. ценю людей, умеющих добиваться результатов, независимо от выбранных методов. Но судя по вашим утверждениям — вы определенно еще не знакомы с Visual Studio и экосистемой .NET в целом. В любом случае хочу пожелать вам удачи в этом нелегком деле, с помощью современных инструментов и приложенных усилий — у вас есть все шансы добиться успеха.
DmitriiMikhailov Автор
Данное решение было успешно протестировано для отправки запросов на лицензирование аптек. А вы какими инструментами пользуетесь для визуализации электронной подписи?
tkachvlad
У нас пиратка)
DmitriiMikhailov Автор
В крупной фармацевтической компании, где я работал до переезда, лицензии закупались внушительными партиями — по 30 тыс. рублей за штуку. Крупные компании боятся проверок, потому что штрафы могут быть значительно выше сэкономленных средств.
Shaman_RSHU
30 тыс. рублей за штуку - это серверная лицензия КриптоПро CSP. Зачем везде серверная?
DmitriiMikhailov Автор
Серверная лицензия нужна для подписания на сервере, если вы используете удаленый рабочий стол, насколько я помню. КриптоПро PDF это отдельный модуль, который встраивается в Adobe Reader и позволяет подписывать PDF документы с визуализацией. Стоимость лицензии колеблется в диапазоне 20-30 тысяч рублей за одно рабочее место, так же необходимо приобрести лицензионный ключ для КриптоПро CSP — достаточно клиентской версии в данном случае.
itshnick88
Не пользуемся - она юридически бесполезна
DmitriiMikhailov Автор
Визуализация? Да, это просто картинка с информацией, я об этом говорил в начале статьи. Но многие госорганы не принимают документы без визуализации, даже при наличии *.sig. Поэтому многие крупные организации активно закупают лицензии КриптоПро PDF в достаточно больших количествах.
mitzury
А можно ли на РНР или как у Вас в статье на С# использовать свой функционал подписи PDF аналогичный Adobe PDF только с автоматизацией? (включая визуализацию)
DmitriiMikhailov Автор
Не очень понял вопрос. Вы хотите на PHP реализовать аналогичный функционал? Да, вы можете использовать PHP для подписания документов и добавления визуализации. Есть нюансы в зависимости от того как вы собираетесь реализовать подписание — на серверной стороне или на клиентской с передачей подписанного хэша на сервер, но механизм похожий. Можете использовать библиотеку CryptoProBuilder, которую я недавно опубликовал либо использовать КриптоПро SDK для PHP, но для этого потребуется настроить окружение. В принципе, на мой взгляд, консольной утилиты будет достаточно, если вы не собираетесь подписывать кусок XML документа и из него формировать PDF с визуализацией, в таком случае я бы использовал SDK. Для работы с PDF в PHP можете выбрать любую библиотеку, но не забывайте что подписание должно происходить после добавления визуализации, иначе сломаете хэш и подпись не пройдет проверку.