Как программно снять электронную подпись с файла .p7s в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При автоматизации документооборота в 1С часто возникает задача работы с файлами, подписанными с помощью КриптоПро CSP. Если файлы имеют расширение .p7s, это означает, что перед нами контейнер PKCS#7. Хотя встроенный объект МенеджерКриптографии отлично справляется с процессами подписания и шифрования, в нем отсутствует прямой метод для «снятия» или извлечения данных из прикрепленной подписи. Рассмотрим, как решить эту задачу с помощью внешних инструментов.

Понимание проблемы: что значит «снять подпись»?

Прежде чем приступать к написанию кода, важно уточнить, какой тип подписи используется в вашей системе:

Решение через использование консольной утилиты csptest

Так как встроенный МенеджерКриптографии не предоставляет методов для извлечения содержимого из PKCS#7, мы воспользуемся консольной утилитой csptest.exe, которая поставляется вместе с КриптоПро CSP. Этот инструмент позволяет выполнять операции с подписями непосредственно через вызовы операционной системы.

Для реализации логики нам потребуется метод ЗапуститьПриложение, который позволит отправить команду операционной системе на обработку файла.

Разберем пример команды, которая позволяет проверить подпись и извлечь данные:


// Пример формирования строки запуска внешней утилиты
// Параметры:
// -sfsign: основная команда для работы с подписями
// -verify: команда проверки
// -my: поиск сертификата в личном хранилище
// -in: входной файл
// -out: выходной файл (результат)

КомандаЗапуска = "csptest.exe -sfsign -verify -my ОтпечатокСертификата -in ""C:\Files\document.xml.p7s"" -out ""C:\Files\document.xml""";
ЗапуститьПриложение(КомандаЗапуска, , Истина, КодВозврата);

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

Рекомендованный современный подход: использование cryptcp.exe

Более современным стандартом для работы с подписями в консоли является утилита cryptcp.exe. Она более функциональна и стабильна в работе с различными форматами подписей. Процесс использования аналогичен csptest, однако команда выглядит иначе:


// Команда для декодирования и извлечения исходного файла
// -verify: режим проверки
// -deattach: ключ для извлечения исходного файла из контейнера
// -dir: директория для сохранения результата

Команда = "cryptcp.exe -verify -deattach -dir ""C:\OutputFolder"" ""C:\Input\document.p7s""";
ЗапуститьПриложение(Команда);

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

Интеграция через COM-объекты (CAdESCOM)

Если вы не хотите полагаться на внешние исполняемые файлы и предпочитаете работу внутри оперативной памяти процесса 1С, рекомендуется использовать КриптоПро ЭЦП Browser plug-in. Он предоставляет COM-объект CAdESCOM.CadesSignedData.

Этот путь является более «чистым» с точки зрения разработки, так как позволяет получать содержимое подписанного файла и проверять его статус без запуска сторонних процессов Windows. Для этого необходимо:

  1. Установить плагин на рабочее место.
  2. Создать объект Новый COMОбъект("CAdESCOM.CadesSignedData") в коде 1С.
  3. Использовать методы ContentEncoding и Content для извлечения данных из свойства SignedData.

Заключение: Хотя 1С не имеет «из коробки» метода СнятьПодпись, интеграция с утилитами csptest или cryptcp через метод ЗапуститьПриложение является надежным и проверенным решением. Выбор между консольными утилитами и COM-объектами зависит от ваших архитектурных требований и возможности установки дополнительных библиотек на клиентские машины.

← На главную