Как подписать XML открепленной подписью — значит сформировать отдельный файл подписи (.sig, .sign или .p7s), который лежит рядом с исходным XML и не меняет ни одного байта самого документа. Тема узкая, но именно на ней спотыкаются интеграторы: то расширение не то, то госсистема возвращает «подпись не прошла», то вместо отсоединённого .sig случайно сделали присоединённый контейнер. Здесь разберём, чем CMS-подпись отличается от XMLDSig detached, как подписать XML в КриптоАРМ и через cryptcp, что проверить перед отправкой в госсистему и какие ошибки чаще всего ломают подпись. Это часть большого материала про подписание XML файла электронной подписью, где собраны все способы работы с этим форматом.
Автор статьи — Мария Ж, юрист со стажем более 20 лет, соучредитель сервиса КЭДО Добыто, спикер на конференциях по КЭДО и юриспруденции, судебный эксперт в сфере корпоративного и трудового права. Занимается наймом персонала более 13 лет. Автор более 1000 статей о цифровой подписи, трудовом праве, КЭДО и HR.
Что такое открепленная подпись XML и чем она отличается от присоединённой
Открепленная подпись — это вид электронной подписи, при котором файл подписи формируется отдельно от документа. По-другому её называют отсоединённой или detached. Подписали XML — получили рядом второй файл, обычно с расширением .sig (бывает .sign, .sgn, .bin, .p7s). Исходный XML при этом остаётся ровно таким, каким был. Ни одного символа внутрь не дописывается.
Присоединённая (attached) подпись работает наоборот. Она упаковывает документ и подпись в единый контейнер. Открыть его обычным просмотрщиком уже не выйдет — нужен криптопровайдер. Для XML это часто неудобно: машина, которая принимает документ на той стороне, ждёт чистый XML на вход, а не контейнер CMS с зашитым внутрь телом.
Отсюда главное практическое правило. Если на той стороне нужен отдельный .sig — тип подписи выбирайте «открепленная» ещё на этапе подписания. Потом переделать не получится: из присоединённого контейнера вытащить открепленный файл нельзя, это разные структуры данных, и одно в другое напрямую не конвертируется. Решение тут одно — взять исходный XML и подписать заново, на этот раз с галочкой «отсоединённая».
Мария Ж, специалист по цифровой подписи и КЭДО:
«Самый частый затык у новичков — подписали XML присоединённой, отправили в госсистему, а та ждёт открепленный сиг-файл. И всё, приёмка возвращает ошибку. Готового «экспорта» из attached в detached нет. Берёте исходник, перевыпускаете подпись с правильной галочкой. Две минуты, но без этого никак.»
Форматы открепленной подписи для XML: CMS, CAdES и XMLDSig detached
Тут начинается то, на чём ломается половина интеграций. «Открепленная подпись XML» — это не один формат, а как минимум два разных мира, и они не взаимозаменяемы.
Первый мир — это CMS (он же PKCS#7) и его усовершенствованные варианты CAdES. Подпись лежит в отдельном файле .sig или .p7s, внутри — криптография по ГОСТ Р 34.10-2012 и хэш по ГОСТ Р 34.11-2012. Это то, что выдают КриптоАРМ, ViPNet, КриптоПро CSP через cryptcp. Госключ, к слову, тоже формирует именно отсоединённые файлы подписи и возвращает их в формате CAdES-T — то есть со штампом доверенного времени, что позволяет проверять подпись и после того, как сертификат протухнет.
Второй мир — XMLDSig detached. Это формат электронных подписей XML, разработанный консорциумом W3C. Подпись здесь — это сам по себе XML-узел <Signature> со ссылкой (Reference URI) на подписываемые данные. Detached-вариант означает, что подпись ссылается на внешний документ, а не вкладывается в него (это был бы enveloped) и не оборачивает его (enveloping). Многие госсистемы и SOAP-обмены требуют именно XMLDSig detached с расчётом хэша по ГОСТ, а не привычный .sig. И если вы принесёте им CMS-подпись вместо XMLDSig — приёмка просто не поймёт, что вы подписали.
Как понять, какой формат вам нужен? Читать требования принимающей стороны буквально. Если в спецификации написано «XMLDSig detached, url http://www.w3.org/2000/09/xmldsig, хэш ГОСТ Р» — значит, обычный КриптоАРМ с его .sig вам не подойдёт, нужен инструмент, который умеет каноникализацию (C14N) и формирует именно XML-подпись. Если же написано просто «открепленная подпись, файл .sig» — тогда подойдёт любая десктопная программа подписи. В практике Добыто мы первым делом запрашиваем у клиента регламент принимающей системы, потому что половина проблем с XML решается именно на этом шаге, до первого подписания.
Что подготовить перед подписанием XML открепленной подписью
Чек-лист короткий, но каждый пункт критичен.
- Криптопровайдер. КриптоПро CSP версии 5.0 (или 4.0, если так требует контур). Без него ни КриптоАРМ, ни cryptcp работать не будут. Криптопровайдер — это та программа, которая собственно считает криптографию по ГОСТ.
- Сертификат и закрытый ключ. Серт должен быть установлен в хранилище «Личные», а его закрытка — на токене (Рутокен, JaCarta) или в реестре. Корневой сертификат удостоверяющего центра — в «Доверенные корневые центры сертификации».
- Программа подписи. КриптоАРМ ГОСТ 3, КриптоАРМ 6, ViPNet PKI Client или командная утилита cryptcp из состава КриптоПро CSP.
- Сам XML-файл. В финальном, готовом виде. Любое изменение после подписания — даже один байт, даже переименование — сделает подпись недействительной.
- Требования принимающей стороны. Формат (.sig или XMLDSig), расширение файла, кодировка вывода (DER или BASE64).
Мария Ж, юрист со стажем более 20 лет:
«Сертификат на 12 лет не панацея. Если документ архивный и хранится долго, подпись надо «ухаживать» — продлевать метками времени, иначе через несколько лет проверка скажет, что серт уже недействителен. Для разовой отправки в госсистему это неважно, а вот для кадрового или финансового архива закладывайте усовершенствованную подпись сразу.»
Образцы документов и памятки по работе с электронной подписью
Открыть список документов
Как подписать XML открепленной подписью в КриптоАРМ
КриптоАРМ — самая ходовая десктопная программа для этой задачи. Подписывает файл любого формата и размера, в том числе XML. При подписании папки целиком на каждый файл внутри создаётся своя подпись — удобно, если XML-ок много и надо подписать их скопом.
Сам процесс строится через мастер «Подпись и шифрование». Ключевой момент — в дополнительных настройках выбрать вид подписи «Отсоединённая» и задать расширение файла подписи (.sig по умолчанию). Если этого не сделать, программа сформирует присоединённый контейнер, и придётся всё переделывать.
Как подписать XML открепленной подписью в КриптоАРМ: пошаговая инструкция
Показать пошаговую инструкцию
- Шаг 1. Убедитесь, что установлен КриптоПро CSP, сертификат лежит в хранилище «Личные», а токен с закрытым ключом подключён к компьютеру.
- Шаг 2. Кликните правой кнопкой мыши по нужному XML-файлу и выберите «КриптоАРМ» — «Подписать». Либо откройте мастер «Подпись и шифрование» и добавьте файл вручную.
- Шаг 3. Пройдите первые шаги мастера. В разделе настроек подписи снимите флаг «Сохранить подпись в одном файле с данными» (или поставьте флаг «Отсоединённая подпись» — формулировка зависит от версии).
- Шаг 4. Задайте расширение файла подписи — .sig или .sign, как требует принимающая сторона. Если нужна BASE64-кодировка, выберите её в окне выходного формата.
- Шаг 5. Добавьте сертификат подписи кнопкой «Добавить», выберите нужный из списка и нажмите «Подписать». При запросе введите пин-код токена.
- Шаг 6. В той же папке появится файл подписи с именем вида document.xml.sig. Передавайте его всегда в паре с исходным XML.
За время работы сервиса Добыто мы подключили десятки компаний, где подписание XML встроено в обмен с госсистемами, и почти всегда первая настройка упирается в одно — расположение сертификата и прав на токен. Когда серт и закрытка на месте, дальше всё идёт по накатанной.
Подписание XML через КриптоПро CSP командой cryptcp
Если подписей много и они генерируются автоматически, мышкой кликать никто не будет. Тут на сцену выходит cryptcp — консольная утилита из состава КриптоПро CSP. Работает и на Windows, и на Linux, что важно для серверных контуров.
Базовый сценарий: команда формирует отсоединённую (detached) подпись для message.xml с заданным расширением. Параметр, отвечающий за открепленность, — ключ -detached, расширение задаётся через -dir или прямым указанием имени выходного файла. На выходе — файл message.xml.sign рядом с исходником. Никакой графики, всё скриптуется и встаёт в автозапуск.
Мария Ж, судебный эксперт в сфере трудового права:
«Когда документов реально много — счета, квитанции, выгрузки из 1С пачками — ручное подписание это просто слив рабочего времени. Тут либо cryptcp в скрипте, либо серверное решение с обезличкой — обезличенным сертификатом на юрлицо, который привязан к информационной системе и подписывает автоматом, без участия сотрудника.»
Важный нюанс по XMLDSig. cryptcp и КриптоАРМ формируют CMS/CAdES-подпись (.sig, .p7s). Если же госсистема требует именно XMLDSig detached с каноникализацией — голым cryptcp вы её не сделаете. Здесь нужна либо своя библиотека на базе КриптоПро CSP (например, через классы System.Security.Cryptography.Xml в .NET плюс ГОСТ-провайдер), либо специализированный модуль, который умеет приводить узел SignedInfo к каноническому виду по C14N и формировать значение подписи в Base64. Это уже работа разработчика, а не кадровика.
XMLDSig detached, каноникализация, ГОСТ-хэш в SOAP-пакетах — это та зона, где одна неверная буква в требованиях рушит всю интеграцию, а ошибку видно только когда приёмка вернула отказ. Если ваш обмен с госсистемой или контрагентом завязан на подписание XML и вы не хотите утонуть в перевыпусках сертификатов и ручной возне с .sig, специалисты Добыто помогут собрать процесс так, чтобы подпись формировалась автоматически и в нужном формате с первого раза.
Следите за нашими каналами
Никакой воды — только важное и новости первыми.
XMLDSig detached: когда нужен W3C-формат вместо .sig
Разберём отдельно, потому что путаница тут стоит интеграторам недель. XMLDSig — это рекомендация W3C по синтаксису и обработке XML-подписей. Подпись поддерживает аутентификацию, целостность данных и неотрекаемость — всё то же, что и CMS, но живёт внутри XML-разметки.
Три варианта расположения подписи в XMLDSig:
- Enveloped — подпись вложена внутрь самого подписываемого XML, как дочерний узел. Меняет документ.
- Enveloping — подпись оборачивает данные, данные лежат внутри узла подписи.
- Detached — подпись ссылается на внешние данные через Reference URI и хранится отдельно. Вот это и есть открепленный вариант для XML по версии W3C.
Для отечественной криптографии в XMLDSig используется хэш по ГОСТ Р 34.11-2012 и подпись по ГОСТ Р 34.10-2012. Узел SignedInfo приводится к каноническому виду (это и есть каноникализация, C14N), от него считается хэш, хэш подписывается, результат в Base64 кладётся в узел SignatureValue, а открытый ключ сертификата — в BinarySecurityToken. Звучит как шаманство, но именно этого ждут многие приёмные шлюзы. Я думаю, главное правило тут такое: если в требованиях фигурирует строка http://www.w3.org/2000/09/xmldsig — забудьте про привычный .sig из КриптоАРМ, вам нужен XMLDSig.
Когда какой формат. Detached .sig (CMS/CAdES) — для большинства бытовых задач: отправка отчёта в Минобороны на флешке, обмен документами с контрагентом, хранение в архиве. XMLDSig detached — для машинного обмена со СМЭВ, SOAP-сервисами, рядом государственных и финансовых ИС, где документ читается автоматически и подпись должна быть частью XML-протокола.
Проверка открепленной подписи XML
Проверка отсоединённой подписи всегда требует два файла: исходный XML и файл подписи .sig. Программа берёт оригинал, пересчитывает хэш, сравнивает с тем, что зашит в подписи, и проверяет сертификат подписанта по цепочке до корневого УЦ. Если хоть один байт XML изменился после подписания — проверка покажет, что подпись недействительна.
В КриптоАРМ это делается через мастер «Проверка и расшифрование»: загружаете два файла — оригинал и .sig — проверка идёт автоматически. Бывает засада с именами: если файл подписи назван не по шаблону «имя.xml.sig», программа не находит пару сама. Тогда открываете «Подробно», жмёте «Указать путь к файлу» и выбираете исходный XML вручную.
Проверить подпись можно и онлайн, без установки тяжёлого софта — на портале Госуслуг есть сервис подтверждения подлинности электронной подписи, который принимает и присоединённую, и отсоединённую подпись (портал Госуслуг). Для отсоединённой загружаете оригинал и файл подписи отдельно. В сервисе Добыто проверку открепленной подписи мы вынесли в отдельный инструмент — загружаете XML и .sig, получаете статус и протокол.
Проверка электронной подписи онлайн — сервис Добыто
Проверка электронной подписи
Загрузите файл подписи или пару файлов для открепленной подписи.
Сервис проверит целостность подписи и покажет сведения о сертификате.
1 Выберите тип подписи:
Для присоединенной подписи нужен один файл. Для открепленной проверки требуются документ и файл подписи.
2 Загрузите документ и подпись:
Следите за нашими каналами
Никакой воды — только важное и новости первыми.
Документ
Файл подписи
Подписать документ электронной подписью онлайн
Типичные ошибки при подписании XML открепленной подписью
Соберу грабли, на которые наступают чаще всего. У каждой — своя цена в потерянном времени и сорванных сроках.
Ошибка 1. Подписали присоединённой вместо открепленной. Делают так по невнимательности — мастер по умолчанию часто ставит attached. Принимающая система ждёт чистый XML плюс отдельный .sig, а получает контейнер. Цена ошибки: полный перевыпуск подписи на всех документах пакета, иногда это сотни файлов.
Ошибка 2. Спутали CMS .sig и XMLDSig. Самая дорогая. Сделали detached .sig в КриптоАРМ, а шлюз требовал XMLDSig detached. Внешне оба «открепленные», но это разные форматы. Цена: переделка через разработку, потому что готового инструмента под XMLDSig в десктопных программах нет.
Ошибка 3. Изменили XML после подписания. Поправили один символ, переименовали файл, перекодировали из UTF-8 в Windows-1251 — и подпись слетела. Цена: подпись недействительна, документ к приёмке не допущен, надо подписывать заново.
Ошибка 4. Не то расширение. Госсистема ждёт .sign, а программа выдала .sig. Или наоборот. Формально подпись та же, но автоматическая приёмка не распознаёт файл. Цена: переименование помогает не всегда, иногда нужен перевыпуск с правильным расширением в настройках.
Ошибка 5. Забыли про долговременное хранение. Подписали обычной подписью документ, который должен лежать в архиве годами. Сертификат закончился — проверить подпись через несколько лет уже нельзя. Цена: переподписание архива метками времени задним числом, что не всегда возможно. Для архивных XML сразу делайте усовершенствованную подпись формата CAdES-T или выше.
Стоимость подписания и работы с электронной подписью в сервисе Добыто
Если подписание XML — часть кадрового или документного обмена внутри компании, стоимость считается не за подпись, а за рабочее место в сервисе. Цена зависит от численности сотрудников, выбранного тарифа и набора подключаемых модулей.
| Тариф | Стоимость | Условия |
|---|---|---|
| Старт — для небольших компаний, начинающих переход на КЭДО | от 30 ₽ за сотрудника / мес | до 25 сотрудников, ПЭП и УНЭП |
| Бизнес — для среднего бизнеса с полным набором функций | от 50 ₽ за сотрудника / мес | без лимита сотрудников, ПЭП, УНЭП, УКЭП, интеграция с 1С, архив |
| Корпорация — для крупного бизнеса с SLA и кастомными интеграциями | по запросу | всё из Бизнеса, выделенный сервер, SLA 99.9%, API |
Итоговая сумма зависит от численности персонала, выбранного тарифа и объёма подключаемых модулей, включая электронный архив с долговременным хранением подписей — актуальные тарифы сервиса Добыто помогут сориентироваться точнее. Отдельная работа с открепленной подписью для интеграции с госсистемами рассчитывается индивидуально.
Выводы: подписание XML открепленной подписью
Открепленная подпись XML — это отдельный файл .sig (или .sign, .p7s), который формируется рядом с документом и не меняет его содержимое. Главное решение принимается до первого подписания: какой формат нужен принимающей стороне. CMS/CAdES-подпись в виде .sig делают КриптоАРМ, ViPNet и cryptcp из КриптоПро CSP. XMLDSig detached — это другой формат по стандарту W3C, его обычными десктопными программами не сделаешь, нужна разработка с каноникализацией и ГОСТ-хэшем.
На практике порядок такой: получить регламент принимающей системы, проверить требуемый формат и расширение, установить криптопровайдер и сертификат, выбрать в мастере именно отсоединённую подпись, подписать готовый неизменяемый XML, проверить пару «оригинал плюс .sig». Из присоединённой подписи открепленную не вытащить — только перевыпуск. Любое изменение XML после подписания убивает подпись, поэтому подписывают всегда финальную версию файла.
Для архивных и долгоживущих документов закладывайте усовершенствованную подпись со штампом времени сразу — сертификаты сейчас выдают на срок до 12 лет, но кадровые и финансовые документы хранятся дольше, и без меток времени проверка после истечения сертификата станет невозможной. Массовое и автоматическое подписание выносите в скрипты на cryptcp или в серверное решение с обезличенным сертификатом.
Часто задаваемые вопросы
Чем открепленная подпись XML отличается от присоединённой?
Какое расширение у файла открепленной подписи XML?
В чём разница между .sig и XMLDSig detached?
Можно ли из присоединённой подписи сделать открепленную?
Какие программы подписывают XML открепленной подписью?
Как проверить открепленную подпись XML?
Можно ли подписать сразу несколько XML-файлов?
Что будет, если изменить XML после подписания?
Какой алгоритм используется для подписи XML по ГОСТ?
Как хранить подписанный XML долго, если сертификат закончится?
Подходит ли Госключ для подписания XML открепленной подписью?
Подписание XML открепленной подписью кажется мелочью ровно до того момента, пока приёмка не вернула отказ из-за неверного формата или перепутанного расширения. Сервис Добыто закрывает всю цепочку работы с электронной подписью — от выбора вида подписи и формата файла до встраивания подписания в обмен с вашими системами и долговременного хранения подписей в защищённом архиве.
Мы подключили десятки компаний, где подписание документов встроено в ежедневный поток, и знаем практику работы с госсистемами, форматами CMS, CAdES и требованиями к хранению. Если ваш процесс завязан на XML и открепленные подписи, мы поможем собрать его так, чтобы подпись формировалась в нужном формате с первого раза.
- Поддержка всех трёх видов подписей — ПЭП, УНЭП, УКЭП — для любого документа
- Работа с открепленными подписями: документ и .sig связаны автоматически, разорвать пару случайно нельзя
- Вся цепочка подписей фиксируется с отметками времени — защита при проверках и в суде
- Хранение документов и подписей до 50 лет с долговременной валидностью
- Готовый коннектор с 1С (ЗУП, КА, ERP) — ставится за час без привлечения разработчиков
- Три вида поставки — облачная, on-premise, гибридная — под требования ИБ и VPN-периметра
- Защищённые каналы связи, шифрование данных, соответствие 152-ФЗ, лицензии ФСТЭК и ФСБ