При работе с Библиотекой стандартных подсистем (БСП) разработчики часто сталкиваются с задачей подписания данных. Если стандартное подписание файлов (PKCS#7) является привычной операцией, то получение подписи в формате XMLDSig (стандарт W3C) требует иного подхода к инициализации параметров. Рассмотрим, как правильно настроить процесс подписания для получения корректного XML-документа с узлом ds:Signature.
Основная проблема при использовании стандартных методов ЭлектроннаяПодписьКлиент заключается в том, что передача простого адреса временного хранилища с двоичными данными не инструктирует систему о необходимости формирования XMLDSig. БСП по умолчанию может формировать открепленную или присоединенную подпись в бинарном виде. Для работы со стандартом XMLDSig необходимо передать специальную структуру параметров, которая содержит конверт и правила формирования подписи.
Для того чтобы получить результат в виде XMLDSig, нам необходимо выполнить следующие действия в клиентском модуле:
ПараметрыКонвертаXML.Конверт и параметры XMLDSig.Рассмотрим детально, как подготовить данные и вызвать метод подписания:
// Описываем процедуру вызова подписания
&НаКлиенте
Процедура ПодписатьЭП(Команда)
ОбработкаРезультата = Новый ОписаниеОповещения("ПослеПодписанияДанных", ЭтотОбъект);
// Подготавливаем структуру для XMLDSig
СтруктураПодписи = Новый Структура("Конверт,ПараметрыXMLDSig");
ПараметрыКонверта = ЭлектроннаяПодписьКлиент.ПараметрыКонвертаXML();
ПараметрыКонверта.СообщениеXML = СодержимоеВашегоXML; // Здесь передаем строку с XML-файлом
СтруктураПодписи.Конверт = ЭлектроннаяПодписьКлиент.КонвертXML(ПараметрыКонверта);
СтруктураПодписи.ПараметрыXMLDSig = ЭлектроннаяПодписьКлиент.ПараметрыXMLDSig();
ОписаниеДанных = Новый Структура;
ОписаниеДанных.Вставить("Операция", "ПодписаниеДанных");
ОписаниеДанных.Вставить("ЗаголовокДанных", "Подписание хмл файла - " + ИмяФайла);
ОписаниеДанных.Вставить("Данные", СтруктураПодписи);
ЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных, Неопределено, ОбработкаРезультата);
КонецПроцедуры
После того как пользователь выберет сертификат и подпись будет сформирована, управление перейдет в процедуру оповещения. Обратите внимание, что доступ к данным подписи осуществляется через свойство СвойстваПодписи в возвращаемом объекте Результат.
&НаКлиенте
Процедура ПослеПодписанияДанных(Результат, ДополнительныеПараметры) Экспорт
Если Результат.Статус = "Успех" Тогда
// Подписанный XML будет содержаться в структуре подписи
ПодписанныйXML = Результат.СвойстваПодписи.Подпись;
// Теперь вы можете сохранить результат или передать его дальше
Иначе
// Обработка ошибок при подписании
Сообщить(Результат.ОписаниеОшибки);
КонецЕсли;
КонецПроцедуры
При работе с данным механизмом учитывайте следующие важные моменты:
Результат может отличаться в разных версиях БСП (например, 3.1.6 и 3.1.9). Если вы не видите свойства СвойстваПодписи, обязательно проверьте состав Результат в отладчике на этапе ПослеПодписанияДанных.Результат в табло.ПараметрыКонвертаXML, соответствуют требованиям вашей задачи (например, требуется ли исключительная канонизация или специфические алгоритмы хэширования).Соблюдая описанный порядок действий, вы сможете корректно формировать подписи стандарта XMLDSig, которые будут валидны для внешних систем, ожидающих интеграцию именно по этому протоколу.