В процессе работы с электронным документооборотом (ЭДО) часто возникает необходимость извлечь данные о подписанте непосредственно из файла подписи. Файлы с расширением .p7s (стандарт PKCS#7) представляют собой криптографический контейнер, который, помимо самой подписи, в большинстве случаев содержит и открытый ключ (сертификат) автора. В этой статье мы подробно разберем, как средствами платформы 1С:Предприятие и встроенных инструментов извлечь этот сертификат и сохранить его как отдельный файл .cer.
Самый прямой и «чистый» способ решения задачи в 1С — использование объекта МенеджерКриптографии. Этот объект позволяет взаимодействовать с установленным в системе криптопровайдером (например, КриптоПро CSP или ViPNet CSP).
Рассмотрим пошагово, как реализовать извлечение сертификата. Проанализируем алгоритм: сначала нам нужно инициализировать менеджер, затем передать ему данные подписи и получить массив объектов типа СертификатКриптографии.
// Инициализируем менеджер криптографии.
// Имя провайдера и тип можно оставить пустыми, тогда 1С использует настройки по умолчанию.
Менеджер = Новый МенеджерКриптографии("", "", 75);
// Указываем путь к файлу подписи или получаем двоичные данные файла
ПутьКФайлуПодписи = "C:\Signatures\document.p7s";
ДвоичныеДанныеПодписи = Новый ДвоичныеДанные(ПутьКФайлуПодписи);
Попытка
// Извлекаем массив сертификатов из подписи
МассивСертификатов = Менеджер.ПолучитьСертификатыИзПодписи(ДвоичныеДанныеПодписи);
Если МассивСертификатов.Количество() > 0 Тогда
// Обычно первый сертификат в массиве — это сертификат подписанта
СертификатОбъект = МассивСертификатов[0];
// Выгружаем данные сертификата в двоичные данные
ДанныеСертификата = СертификатОбъект.Выгрузить();
// Сохраняем как файл .cer
ДанныеСертификата.Записать("C:\Certificates\extracted_cert.cer");
Сообщить("Сертификат успешно извлечен!");
Иначе
Сообщить("В файле подписи не найдено сертификатов.");
КонецЕсли;
Исключение
Сообщить("Ошибка при работе с криптографией: " + ОписаниеОшибки());
КонецПопытки;
Важный нюанс: метод ПолучитьСертификатыИзПодписи возвращает именно массив. Это происходит потому, что в .p7s может быть упакована вся цепочка доверия — от сертификата пользователя до корневого сертификата удостоверяющего центра. Если вам нужен именно подписант, проанализируйте свойства объекта СертификатКриптографии, такие как Субъект или СерийныйНомер. Для низкоуровневой проверки содержимого контейнера можно использовать универсальный ASN.1-анализатор, который декодирует .p7s, .p7m, .cer и .der и позволяет просмотреть структуру сертификатов и подписи.
Если вы работаете в конфигурации 1С:Документооборот, то в вашем распоряжении уже есть мощная подсистема «Электронная подпись». Разберем, почему лучше использовать именно её. БСП автоматически обрабатывает настройки криптопровайдеров на сервере и клиенте, а также содержит готовые функции для разбора структур подписи.
Проанализируем работу с общим модулем ЭлектроннаяПодпись. В современных версиях БСП для получения данных сертификата можно использовать методы, которые абстрагируют нас от прямого создания МенеджераКриптографии. Это исключает ошибки, связанные с неправильным указанием типа провайдера.
Использование БСП предпочтительно, так как программа сама определит, какой алгоритм (ГОСТ 2001 или 2012 года) используется, и подберет нужные параметры инициализации.
Бывают ситуации, когда на сервере 1С не настроены криптографические профили или возникают сложности с правами доступа к криптопровайдеру через COM-интерфейс. В таких случаях можно воспользоваться внешней утилитой cryptcp от компании КриптоПро.
Выясним, как запустить этот процесс из 1С. Мы будем использовать метод ЗапуститьПриложение(). Команда для извлечения сертификата выглядит следующим образом:
cryptcp -copycert -f <путь_к_файлу_подписи> <каталог_назначения>
Рассмотрим пример кода:
ПутьКУтилите = """C:\Program Files\Crypto Pro\CSP\cryptcp.exe""";
ФайлПодписи = """C:\Temp\sign.p7s""";
КаталогВыгрузки = "C:\Temp\";
// Формируем строку запуска
Команда = ПутьКУтилите + " -copycert -f " + ФайлПодписи + " " + КаталогВыгрузки;
// Запускаем выполнение
ЗапуститьПриложение(Команда, , Истина); // Истина - ждать завершения
Этот способ крайне надежен для фоновых заданий на сервере, однако он требует установленного ПО КриптоПро и наличия прав на запуск исполняемых файлов.
Разберем важный момент, о котором упоминалось в обсуждении на форуме. Существует два основных вида подписи:
.p7s находятся и исходные данные (текст документа), и сама подпись, и сертификат..p7s содержит только криптографический хеш и метаданные. Исходный файл лежит отдельно.В 99% случаев, независимо от того, присоединенная это подпись или отсоединенная, сертификат автора включается в состав .p7s. Однако стандарт позволяет создать подпись без включения сертификата для экономии места. В этом случае извлечь .cer из такого файла невозможно — его там физически нет. Если вы столкнулись с такой ситуацией, вам придется искать сертификат в локальном хранилище или запрашивать его у отправителя.
Если ваш сервер 1С работает под управлением Linux, использование МенеджерКриптографии также возможно. Однако стоит помнить, что путь к библиотекам криптопровайдера должен быть корректно прописан в файле настроек или определен через УстановитьРасширениеРаботыСКриптографией(). При работе на Linux методы 1С взаимодействуют с openssl или установленным КриптоПро для Linux. Рекомендуется проверять кодировку файла .p7s — 1С понимает как бинарный (DER), так и текстовый (Base64) форматы, но некоторые старые версии библиотек могут требовать предварительной конвертации.
Подведем итог. Для решения задачи в среде 1С:ДО наиболее оптимальным является использование Метода 1 (встроенный менеджер), так как он обеспечивает максимальную переносимость кода и не требует настройки внешних утилит при условии правильно настроенного криптопрофиля в системе.