При реализации криптографических механизмов в платформе 1С:Предприятие разработчики часто сталкиваются с вопросом формата подписи. Типичная ситуация: метод подписания выполнен успешно, но на выходе получается отдельный файл подписи, либо возникает необходимость поместить подпись непосредственно внутрь исходного файла. Разберем по шагам, как устроен объект МенеджерКриптографии, какие типы электронных подписей существуют и как правильно организовать хранение подписанных данных.
Рассмотрим стандартный пример кода, вызывающий вопросы у начинающих разработчиков при подписании файлов:
МенКрипт = Новый МенеджерКриптографии("Infotecs Cryptographic Service Provider", "", 2);
// Вариант 1: сохранение подписи в отдельный файл
МенКрипт.Подписать("C:\1.pdf", "C:\1.p7s", Сертификат);
// Вариант 2: вызов метода в виде функции
ДвоичныеДанныеПодписи = МенКрипт.Подписать(Новый ДвоичныеДанные("C:\1.txt"), Сертификат);
Проанализируем поведение этих двух вариантов вызова метода Подписать:
.p7s или .sig).ДвоичныеДанные или пути к файлу) и сертификат. Метод возвращает объект ДвоичныеДанные, содержащий сформированную электронную подпись. Исходные данные при этом не модифицируются.Таким образом, во втором случае подпись никуда не прячется внутри файла: она возвращается в виде двоичных данных, которые разработчик может сохранить в реквизит базы данных, передать по API или записать в отдельный файл.
Чтобы понять, почему файл не изменяется сам по себе, рассмотрим подробнее базовые разновидности формирования ЭП:
document.pdf и document.pdf.p7s). Хеш-сумма вычисляется от исходного содержимого. Документ можно спокойно открыть в стандартной программе (Word, Acrobat Reader), а подпись хранится рядом. Это самый распространенный формат в российском ЮЗЭДО..p7m или .sig). Открыть такой файл стандартной программой просмотра уже нельзя: сначала необходимо криптографически извлечь исходный файл из контейнера.Разберем основные практические подходы к решению задачи, когда требуется хранить и передавать один общий объект вместо двух разрозненных файлов.
Для большинства учетных и юридических задач модифицировать сам файл не требуется. Более того, изменение структуры файла часто приводит к нарушению проверки целостности. Общепринятым стандартом является формирование архивного пакета:
Счет.pdf).Счет.pdf.sig для первой подписи, Счет_контрагент.pdf.sig для второй подписи).ЗаписьZipФайла.Посмотрим на пример упаковки пакета в архив средствами встроенного языка 1С:
ИмяАрхива = "C:\Документы\ПакетДокументов.zip";
Архив = Новый ЗаписьZipФайла(ИмяАрхива);
Архив.Добавить("C:\Документы\1.pdf");
Архив.Добавить("C:\Документы\1.pdf.p7s");
Архив.Записать();
Такой архив признается полноценным юридически значимым комплектом документов, при этом к нему можно добавлять дополнительные файлы подписей (например, визы согласования или подпись контрагента) без повреждения исходного содержимого.
Если бизнес-процесс требует передачи именно одного файла-контейнера, содержащего и данные, и подпись:
МенеджерКриптографии реализована штатная работа с присоединенными подписями через свойство ВключениеДанныхВПодпись, а также специальные методы проверки и извлечения исходных данных.CAdESCOM.CadesSignedData), где при вызове метода подписания параметру признака отсоединенности передается значение Ложь.ЗапуститьПриложение().Платформа 1С:Предприятие не имеет встроенного функционала для модификации бинарной структуры PDF-файлов с внедрением стандартов PAdES. Для реализации именно встроенной в PDF подписи применяются внешние специализированные компоненты, SDK разработчиков криптопровайдеров или консольные утилиты, умеющие работать со спецификацией PDF.
Выясним причину, почему сама подпись технически не может быть «отозвана». Электронная подпись представляет собой математический результат шифрования хеш-суммы документа закрытым ключом. Отозвать можно только сертификат открытого ключа в удостоверяющем центре (УЦ).
Проверка статуса сертификата выполняется криптопровайдером следующими путями:
УсовершенствоватьПодпись объекта МенеджерКриптографии.