Как подписать XML-файл электронной подписью в формате XMLDSig средствами БСП?

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

При работе с Библиотекой стандартных подсистем (БСП) разработчики часто сталкиваются с задачей подписания данных. Если стандартное подписание файлов (PKCS#7) является привычной операцией, то получение подписи в формате XMLDSig (стандарт W3C) требует иного подхода к инициализации параметров. Рассмотрим, как правильно настроить процесс подписания для получения корректного XML-документа с узлом ds:Signature.

Основные причины сложностей при подписании

Основная проблема при использовании стандартных методов ЭлектроннаяПодписьКлиент заключается в том, что передача простого адреса временного хранилища с двоичными данными не инструктирует систему о необходимости формирования XMLDSig. БСП по умолчанию может формировать открепленную или присоединенную подпись в бинарном виде. Для работы со стандартом XMLDSig необходимо передать специальную структуру параметров, которая содержит конверт и правила формирования подписи.

Пошаговое решение задачи

Для того чтобы получить результат в виде XMLDSig, нам необходимо выполнить следующие действия в клиентском модуле:

  1. Инициализировать структуру параметров конверта.
  2. Передать текст вашего XML-файла в соответствующее свойство объекта ПараметрыКонвертаXML.
  3. Сформировать структуру данных, содержащую Конверт и параметры XMLDSig.
  4. Вызвать процедуру подписания с передачей этой структуры вместо адреса хранилища.

Пример реализации кода

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


// Описываем процедуру вызова подписания
&НаКлиенте
Процедура ПодписатьЭП(Команда)
    ОбработкаРезультата = Новый ОписаниеОповещения("ПослеПодписанияДанных", ЭтотОбъект);
    
    // Подготавливаем структуру для XMLDSig
    СтруктураПодписи = Новый Структура("Конверт,ПараметрыXMLDSig");
    
    ПараметрыКонверта = ЭлектроннаяПодписьКлиент.ПараметрыКонвертаXML();
    ПараметрыКонверта.СообщениеXML = СодержимоеВашегоXML; // Здесь передаем строку с XML-файлом
    
    СтруктураПодписи.Конверт = ЭлектроннаяПодписьКлиент.КонвертXML(ПараметрыКонверта);
    СтруктураПодписи.ПараметрыXMLDSig = ЭлектроннаяПодписьКлиент.ПараметрыXMLDSig();
    
    ОписаниеДанных = Новый Структура;
    ОписаниеДанных.Вставить("Операция", "ПодписаниеДанных");
    ОписаниеДанных.Вставить("ЗаголовокДанных", "Подписание хмл файла - " + ИмяФайла);
    ОписаниеДанных.Вставить("Данные", СтруктураПодписи);
    
    ЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных, Неопределено, ОбработкаРезультата);
КонецПроцедуры

Обработка результата подписания

После того как пользователь выберет сертификат и подпись будет сформирована, управление перейдет в процедуру оповещения. Обратите внимание, что доступ к данным подписи осуществляется через свойство СвойстваПодписи в возвращаемом объекте Результат.


&НаКлиенте
Процедура ПослеПодписанияДанных(Результат, ДополнительныеПараметры) Экспорт
    Если Результат.Статус = "Успех" Тогда
        // Подписанный XML будет содержаться в структуре подписи
        ПодписанныйXML = Результат.СвойстваПодписи.Подпись;
        // Теперь вы можете сохранить результат или передать его дальше
    Иначе
        // Обработка ошибок при подписании
        Сообщить(Результат.ОписаниеОшибки);
    КонецЕсли;
КонецПроцедуры

Важные рекомендации при разработке

При работе с данным механизмом учитывайте следующие важные моменты:

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

← На главную