Как подписать XML-файл с помощью БСП, используя алгоритм RSA?

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

При интеграции 1С с различными государственными или зарубежными системами часто возникает необходимость подписания XML-документов электронной подписью. Разработчики 1С часто используют для этого механизмы Библиотеки стандартных подсистем (БСП). Однако в процессе работы программисты сталкиваются с тем, что штатные инструменты 1С ориентированы на российские стандарты криптографии (ГОСТ). Давайте подробно разберем, почему возникают сложности при попытке использовать RSA и как с этим работать.

Анализ работы с XMLDSig в БСП

Когда мы используем возможности XMLDSig.ПодписатьДокумент в составе БСП, мы фактически вызываем встроенные механизмы криптопровайдера. В процессе разработки мы можем столкнуться с необходимостью использования конкретного алгоритма, например, www.w3.org/2000/09/xmldsig#rsa-sha1. При вызове функции мы обычно передаем следующие параметры:


XMLDSig.ПодписатьДокумент(
    Оповещение_, 
    Сертификат_, 
    Заголовок_,  
    ДокументXML_, 
    ПодписываемыеДанные_, 
    ДополнительныеДанные_, 
    ШаблонSignature_, 
    МестоВставки_ 
);

Проблема заключается в том, что в результате работы функции XMLDSig мы видим в XML-файле алгоритм gostr34102012-gostr34112012-256. Это ожидаемое поведение для БСП, так как подсистема спроектирована для работы с российскими сертификатами. Попытка вручную заменить строку SignatureMethod внутри XML-файла после того, как подпись уже сформирована, не принесет результата. Давайте выясним, почему так происходит.

Почему нельзя просто изменить строку алгоритма в XML?

Важно понимать: электронная подпись — это не просто запись в файле, это результат математического преобразования данных с помощью закрытого ключа. Если ключ был выпущен по ГОСТ, то попытка подписать его как RSA приведет к невалидной подписи. Проверяющая система при попытке декодировать такую подпись получит ошибку, так как структура данных и математические алгоритмы RSA и ГОСТ принципиально отличаются.

Возможные пути решения задачи

Если ваша задача требует использования алгоритма RSA, который БСП не поддерживает «из коробки», мы предлагаем рассмотреть следующие подходы:

  1. Использование внешних библиотек (COM/ .NET): Если функционала БСП недостаточно, вы можете написать внешнюю библиотеку на C# (DLL), которая будет принимать данные и подписывать их с помощью стандартных криптографических библиотек Windows (через System.Security.Cryptography), поддерживающих RSA. 1С будет обращаться к этой библиотеке как к COM-объекту.
  2. Применение внешних консольных утилит: Для некритичных к скорости интеграции задач можно использовать сторонние консольные утилиты, такие как OpenSSL или специализированные средства для работы с XML-подписями. В этом сценарии 1С сохраняет XML во временный файл, вызывает утилиту через ЗапуститьПриложение, получает подписанный файл и считывает его содержимое обратно.
  3. Проверка требований контрагента: Часто требование RSA — это просто шаблон в документации. Возможно, принимающая сторона способна работать с ГОСТ-алгоритмами, если на сервере установлен соответствующий криптопровайдер. Прежде чем приступать к написанию сложного обмена, рекомендуем уточнить у технической поддержки контрагента, не примут ли они стандартную подпись ГОСТ.

Итоги и рекомендации

Итак, мы разобрали ситуацию и выяснили, что стандартные функции XMLDSig в БСП жестко привязаны к российским стандартам шифрования. Попытка подмены значений в XML не является решением, так как она нарушает целостность криптографической защиты документа. Если использование RSA является обязательным, мы рекомендуем проектировать интеграцию с использованием внешних средств разработки, которые позволяют управлять процессом подписи на более низком уровне, минуя ограничения БСП.

← На главную