Подписать xml файл эцп. Как подписать файл эцп правильно. Проверить электронную подпись в программных модулях платформы «Полигон Про»

Не могу придти к общему пониманию механизмов подписи xml-документов. Буду благодарен за помощь разобраться)

Ситуация у меня такая:

1) есть удостоверяющий центр, выпущенные сертификаты которого проставляются на серверах в хранилище windows.. в личные, доверенные и так далее..не суть.

При логине в приложение пользователь подписывает случайно сгенерированную строку выбранным им сертификатом. На сервере эта подпись проходит проверку:

CAPICOM.SignedData _signedData = new CAPICOM.SignedData(); _signedData.Verify(signedData, false, CAPICOM_SIGNED_DATA_VERIFY_FLAG.CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE); if (_signedData.Content != data) throw new Exception("Контент подписи не совпадает с полученным контентом"); var _certificate = _signedData.Certificates; // сертификат пользователя

Так мы получаем сертификат пользователя (открытый ключ). Важно то, что подпись пройдет проверку только в том случае, если соответствующий открытый ключ сертификата стоит на сервере в хранилище сертов. Это нам и нужно, пускать только тех, чьи серты мы сами выпускали) Здесь вроде понятно.

2) теперь нужно, чтобы эти же пользователи подписывали своими сертами xml-и. Моё ПО на клиенте генерит сами xml-и и подписывает их указанным пользователем сертификатом:

Public static void SignXml(XmlDocument xmlDoc, /*RSA*/AsymmetricAlgorithm Key) { SignedXml signedXml = new SignedXml(xmlDoc); signedXml.SigningKey = Key; Reference reference = new Reference(); reference.Uri = "";//подпись всего xml-документа XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(); reference.AddTransform(env); signedXml.AddReference(reference); KeyInfo keyInfo = new KeyInfo(); keyInfo.AddClause(CryptService.GetKeyInfoClause(Key)); // RSA or GOST signedXml.KeyInfo = keyInfo; signedXml.ComputeSignature(); XmlElement xmlDigitalSignature = signedXml.GetXml(); xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true)); }

XmlDocument doc = new XmlDocument(); doc.PreserveWhitespace = true; doc.Load(path); SignedXml sx = new SignedXml(doc); XmlNodeList nodeList = doc.GetElementsByTagName("Signature"); sx.LoadXml((XmlElement)nodeList); return sx.CheckSignature();

Код работает, но у меня возникают вопросы с пониманием: в таком случае можно подписать xml абсолютно любым сертификатом, не выпущенным нашим УЦ, и так как инфа об открытом ключе хранится в самом подписанном xml, подпись проходит проверку. Этот вариант мне не подходит. У метода CheckSignature есть перегрузка с параметром типа AsymmetricAlgorithm , который проверит сертификат подписи на существование в хранилище, проверит его валидность, срок действия и так далее. Это мне и нужно, но я не знаю заранее какой из пользователей прислал подписанный xml.

Скажите пожалуйста: как проверять подпись xml или как её правильно создавать, чтобы проверку подписи проходили только те xml-и, которые подписаны только нашими сертификатами (которые установлены в хранилище)?

P.s. и в чем вообще смысл держать в xml и саму подпись, и открытый ключ для расшифровки подписи? Если при подписи убрать строку signedXml.KeyInfo = keyInfo; , то xml проверку подписи не проходит.

Согласно закону 218-ФЗ «О государственной регистрации недвижимости» электронные XML-документы и отсканированные образы документов необходимо подписывать усиленной квалифицированной электронной подписью . Все программы серии «Полигон», «Полигон Про» и программа «Подпись Про» подписывают именно такой подписью.

Для подписания:

    Получите ключ подписи (сертификат) в Удостоверяющем центре . Список аккредитованных удостоверяющих центров опубликован на сайте Росреестра (Список удостоверяющих центров). Получить сертификат можно в нашем Удостоверяющем центре ООО «Программный центр» .

    Вместе с подписью приобретите и установите на компьютер программу КриптоПро CSP (она содержит требующиеся российские стандарты подписи), которую также можно приобрести в нашем Удостоверяющем центре ООО «Программный центр» .

Примечание: другие программы для подписи не требуются : КриптоАРМ (возможности КриптоАРМ в части подписи аналогичны возможностям программ серии«Полигон », «Полигон Про » и программы «Подпись Про »).

Примечание: если ключ подписи Вами был получен в Удостоверяющем центре до выхода закона 63-ФЗ "Об электронной подписи" (до 01.07.2013 г.), то такой ключ действует до 01.01.2014 года. Его необходимо заменить на новый для использования в 2017 году. Это связано с тем, что по новому закону в подписи должен быть номер свидетельства СНИЛС (Пенсионного фонда РФ).

Программные модули платформы «Полигон Про»

Подписать электронный документ в программных модулях платформы «Полигон Про»

Чтобы подписать XML-файл выполните следующее:

Примечание: если будут обнаружены ошибки, то ниже структуры XML-файла будет выведен протокол проверки электронного документа с предупреждениями и/или ошибками. Рекомендуется исправить ошибки, а также обратить внимание на предупреждения.

Аналогично можно подписать XML-файл сразу из окна «Просмотр XML », для этого в панели инструментов нажмите на кнопку - « Подписать XML -файл » .

  • Далее программа выполнит подписание основного документа и выдаст сообщение об успешном выполнении.

Примечание: в той же папке, что и подписанный файл, будет сформирован файл подписи с тем же именем, с расширением *. sig .

Подписать группу файлов в программных модулях платформы «Полигон Про»

В программе имеется возможность подписать группу файлов одновременно, для этого выполните следующее:

Примечание: если в списке присутствуют файлы, которые подписывать не нужно, то снимите с них галочки для исключения из процедуры подписания.

  • Нажмите на кнопку « Подписать » , после чего откроется окно со списком установленных сертификатов. Выберите нужный и нажмите « ОК » .

  • Далее программа выполнит подписание всех документов и выдаст сообщение о подписании.

Примечание: если возникнут ошибки при подписании, будет выведен протокол проверки с предупреждениями и/или ошибками. Для корректного подписания требуется исправить ошибки.

Подписать файл в программных модулях платформы «Полигон Про»

В программе имеется возможность подписать любой имеющийся файл, например приложенные файлы к проекту (отсканированные документы или файлы-образы), в том числе таким же способом можно подписать и электронный документ (XML-файл).

  • Главная » в подменю кнопки «Подписать все » нажмите на кнопку - «Подписать… », после чего откроется окно выбора файла.

  • В открывшемся окне выберите файл, который требуется подписать, и нажмите кнопку «Открыть ».

    Откроется окно со списком установленных сертификатов. Выберите нужный и нажмите «ОК ».

  • Далее программа выполнит подписание выбранного документа и выдаст сообщение о готовности.

Примечание: в той же папке что и подписанный файл будет сформирован файл подписи с тем же именем, с расширением * . sig .

Проверить электронную подпись в программных модулях платформы «Полигон Про»

Если Вы получили подписанный файл извне и хотели бы проверить, не был ли изменен полученный файл после его подписания, либо просто проверить правильность сформированной подписи файла, выполните:

    На ленте программного модуля во вкладке «Главная » в подменю кнопки «Подписать все » нажмите на кнопку «Проверить… ».

    Выберите файл содержащий подпись (с расширением *. sig ), который необходимо проверить, либо при необходимости подписанный файл. Если эти два файла находятся в разных папках, то программа выдаст окно с предупреждением, где необходимо нажать на кнопку «Повтор » и выбрать исходный файл.

  • Вам будет выдано окно-протокол с информацией, правильно ли был подписан документ, кем и когда, либо информация о несоответствии исходному файлу, или если произошли другие ошибки, появится сообщение об этом.

Программа «Подпись Про»

Для удобного взаимодействия с Удостоверяющим центром ООО «Программный центр» , управления цифровыми сертификатами и закрытыми ключами ЭП, а также для подписания различных файлов электронной подписью была разработана программа ПодписьПро .

Инструкция по подписанию файлов, если не используются программы серии «Полигон», «Полигон Про» или «Подпись Про».

Как подписать файл электронно-цифровой подписью?

Данная инструкция является примерной, конкретные шаги могут зависеть от установленного на Вашем компьютере программного обеспечения. Часть инструкция выполнена в феврале 2012 года, однако в наших программах предусмотрена более удобная возможность подписания файлов электронных документов усиленной квалифицированной электронной подписью.

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

    криптопровайдер «КриптоПро CSP»;

    «Крипто АРМ» - эта программа необходима только тогда, когда у Вас не используются программы серии "Полигон", эта программа в части подписания идентична программам серии "Полигон", поэтому она не нужна; для подписания файлов программами серии "Полигон" смотрите предыдущую страницу инструкции; подписывать можно как программами серии "Полигон", так и программой КриптоАРМ, если Вы считаете, что это будет удобнее, чем использовать имеющиеся возможности программ серии "Полигон" ;

Каждый файл (XML, скан печатного документа и файлы приложений) необходимо подписать, так как орган кадастрового учета принимает только пары файлов: оригинальный файл и файл подписи к нему. Для того, чтобы подписать файл необходимо выбрать его в окне проводника и нажать правой кнопкой мыши (ПКМ), появится контекстное меню, в нем следует выбрать пункт «КриптоАРМ», а затем «Подписать… ».



Затем убедиться в правильности имени файла



Важно! установить переключатель в положение «DER-кодировка », папку для выходных файлов указать по своему усмотрению. Нажать кнопку «Далее ». В следующем окне назначить параметры подписи


В этом окне самым важным является указать галочку «Сохранить подпись в отдельном файле ». Нажмите кнопку «Далее ». В следующем окне нажмите кнопку «Выбрать »


откроется окно выбора сертификата


в нем выберите сертификат Вашего ключа (смотрите по имени владельца). После выбора нажмите кнопку «ОК » и «Далее ». В последнем окне перед подписанием документа нажмите кнопку «Готово ».

Важно! Для каждого файла необходимо сделать файл подписи, так как принимается только пара: оригинальный файл (xml или другой) + подпись к нему (sig-файл).

В данном разделе предлагается для скачивания программы XML Конвертер / XML Конструктор / XML Отчёты / Просто Подписать / XML Контакт — Росреестр.

Примеры формирования электронных версий документов с помощью программы XML Конструктор и их печатных аналогов с помощью программы XML Отчёты можно скачать в разделе . Также предлагаем посмотреть раздел , в котором вы найдете различные бесплатные утилиты, библиотеки и другое.

Программа XML Конвертер настроена для преобразования XML-файлов/документов Росреестра таких как кадастровые выписки, кадастровые планы территории в другие, удобные для использования форматы, такие как MIF/MID, DXF, CSV, TXT, HTML.

Программа XML Конструктор настроена на создание электронных версий в формате XML, таких документов для кадастровой деятельности как межевые планы, технические планы, карта(план) и др., а также уведомлений о залоге движимого имущества и уведомлений согласно закону FATCA.

Программа XML Отчёты настроена на преобразование электронных документов для кадастровой деятельности таких как межевые планы, технические планы, карта(план) в соответствующие печатные (бумажные) аналоги.

Программа Просто Подписать предназначена для создания и проверки электронных цифровых подписей (ЭЦП).

Программа XML Контакт-Росреестр предназначена для взаимодействия с веб-сервисом Росреестра, т.е. создания заявлений на постановку на кадастровый учет земельных участков и объектов недвижимости, запросов сведений кадастра, получения результатов по данным заявлениям и запросам.

Все программы (кроме Просто Подписать и XML Контакт-Росреестр) имеют демонстрационный режим длительностью 30 дней, позволяющий использовать функционал программ без ограничений. После истечения периода действия демонстрационного режима полагается либо приобрести полные версии программ, либо прекратить их использование. Программа Просто Подписать является бесплатной программой и не имеет ограничений в использовании. Программа XML Контакт-Росреестр находится на стадии бета-тестирования и в настоящее время ее использование бесплатно.

ВАЖНО! Для преобразования с помощью программы XML Конвертер или XML Конструктор XML файлов большого размера нужно скачать и установить внешний обработчик запросов XQuery и перед преобразованием указывать его в соответствующем поле программы. В настоящее время поддерживается два свободно распространяемых обработчика запросов AltovaXML 2010 (разработчик www.altova.com) и Saxon-HE 9.5 (разработчик www.saxonica.com). Скачать их можно с сайта производителя или с данного сайта по ниже приведенным ссылкам:

ВАЖНО! Перед тем как приступить к работе с программами необходимо ознакомиться с инструкциями. Особенно это важно для программы XML Конструктор, т. к. перед работой необходимо понять принцип работы данной программы. Инструкции находятся в той же папке, что и исполнительный файл программы, т. е. для XML Конструктора в папке «c:\ProgramFiles\XMLCON\XMLConstructor\XMLConstructor-help.rtf». Вызвать инструкцию можно через ярлык из главного меню программ Windows, т. е. для XML Конструктора «Пуск->Программы->XMLКонструктор->XML Конструктор — Инструкция». Для программы XML Конструктор инструкция также доступна через меню Справка.

С того момента, как оборот деловых документов и переписки в электронном режиме стал набирать популярность, крайне необходимым стал процесс определения подлинности электронного файла и его подписания. Работа с электронно-цифровой подписью и файлами различного формата уже стала привычным делом нашей жизни. Но у тех, кто сталкивается с подобным действием впервые, неизбежно возникает вопрос, как подписать файл ЭЦП. В зависимости от варианта создания различается и способ проставления данной подписи. Поэтому нужно разобрать особенности каждого из способов.

Заверка текстов, созданных в XML

Если вам предстоит подписать отчет, составленный в XML, то стоит учитывать, что существует несколько вариантов для осуществления этого действия.

  1. Вы можете использовать новый компонент Microsoft Office – InfoPath 2003 года для формирования ЭЦП в XML-формате.
  2. Создание автографа, как для обычного формата. При этом вам нужно будет использовать программу КриптоПро.

Нередко для подписания отчетов с таким форматом в его тэге необходимо создание дополнительного атрибута. В него от символьной строчки, длина которой изменяется и которая содержит значение атрибутов, заносится цифровая подпись. Подобный подход, который является достаточно интересным, но, тем не менее, вполне приемлемым, также можно встретить достаточно часто.

Работа с форматом PDF

Часто возникает вопрос, как подписать файл электронной подписью, если документ создан в формате PDF. Для того, чтобы формировать и проверять ЭЦП документации, созданной в формате PDF, компанией «КриптоПро» была разработана программа «КриптоПро PDF». Данный продукт является способом формирования, а также проверки ЭЦП для писем, которые были созданы в программах Adobe Acrobat, Adobe Reader.

Достаточно важным фактом является то, что «КриптоПро» является бесплатной программой, то есть для ее использования вам не придется осуществлять оплату за предоставленные услуги. Чтобы пользоваться данной программной, вам потребуется ее установить, и уже после этого вы сможете проверять документы.

Подписываем многофайловые отправления

Иногда возникает вопрос, как подписывать фалы ЭЦП, если отправление содержит не один, а несколько актов. В таком случае вы можете формировать свой заверительный автограф отдельно для каждого из них.

Если же такой вариант по каким-либо причинам невозможен, вы можете создать дополнительный элемент текстового типа, куда впоследствии и запишете идентификационные параметры документа, а также – показатели хэш-функций каждого отдельного файла в документе. Это упростит работу и вам, и получателю письма.

На одном из идущих в настоящее время проектов решалась задача подписания (наложения ЭП - электронной подписи) XML документов, а именно SOAP-пакетов. Рекомендованным форматом был OASIS Standard 200401 с профилем X.509 Certificate Token Profile . Эти документы описывают применение созданного www-консорциумом (W3C) формата электронных подписей XML (XMLDSig - XML Digital Signature) в SOAP-сообщениях. XML-подписи, как и другие виды ЭП, поддерживают аутентификацию, целостность данных и неотрекаемость от подписания данных.

Отмечу несколько особенностей формата XMLDSig:

1. Объектом подписания может служить не весь XML-документ, а только его часть, т.е. определённый узел. Согласно OASIS Standard 200401 подписываемым объектом является тело (узел Body ) SOAP-сообщения.

2. Различные части XML-документа могут быть подписаны несколькими исполнителями.

3. XML-подпись может находиться на разных уровнях по отношению к подписываемому объекту:

  • в структуре подписи может находиться URI (унифицированный идентификатор ресурса);
  • XML-подпись может находиться на одном уровне с подписываемым узлом;
  • XML-подпись может находиться внутри подписываемого узла;
  • подписываемый узел может находиться внутри структуры XML-подписи.

4. Для проверки действительности ЭП необходим доступ к объекту подписания.

Структура SOAP-коверта

В общем случае сообщение состоит из заголовка и тела: Header и Body . Header содержит метаданные, а Body данные. XML-подпись помещается в узел Header .

Криптографические алгоритмы и каноникализация.

Для решения задачи были использованы ГОСТ Р 34.11-94 - российский криптографический стандарт вычисления хеш-функции и ГОСТ Р 34.10-2001 - стандарт электронной подписи.

В силу гибкости правил составления XML, одна и та же структура документа и одна и та же часть информации могут быть представлены различными XML-документами. Рассмотрим два документа:

С логической точки зрения они равнозначны, то есть имеют одинаковую XML-схему. Но XML-файлы этих листингов не содержат одну и ту же последовательность символов, что повлечёт разные результаты, например, при получении значения хэша.

Во избежание подобных разночтений были приняты строгие правила форматирования и требования к содержанию XML-сообщений. Процесс приведения XML-документов к унифицированному (каноническому) виду называют каноникализацией (англ. Canonicalization). Примерами правил может быть применение определённой схемы кодирования (UTF-8), нормализация значений атрибутов, использование двойдых кавычек для значений атрибутов, определённый порядок атрибутов и объявлений пространств имён, и др. Каноникализация XML бывает нескольких видов, которые отличаются составом правил. Побробнее о процессе каноникализации можно прочитать в официальной спецификации W3C (русскоязычные статьи на эту тему можно найти и )

Библиотека SIRCrypt

Для реализации подписания XML в DIRECTUM была написана COM-библиотека, внутри которорй описаны 3 класса: Hasher , Signer и XMLCanonicalizer для получения хэша, значения ЭП и каноникализации XML-документов соответственно.

Для функционирования библиотеки требуется Crypto PRO CSP (тестировалась на версии Crypto PRO CSP 3.6.6497 KC2 ) и .NET (минимально 2.0).

Регистрация библиотеки выполняется выполнением следующей команды:

> regasm.exe "путь к dll" /codebase /tlb

Объект Hasher для вычисления хэша по ГОСТ

Содержит поля Content (тип "строка") и HashValueAsBase64 (тип "строка"), а также метод для вычисления значения хэш-функции Hash() . Для вычисления необходимо означить Content , вызвать метод Hash() , в результате которого в поле HashValueAsBase64 запишется значение хэш-функции в Base64.

Объект Signer для получения значения ЭП по ГОСТ

Содержит поля Content (тип "строка"), ContainerName (тип "строка"), CertificateAsPEM (тип "строка"), BESignatureValueAsBase64 (тип "строка"), метод Sign() . После инициализации объекта необходимо означить Content (данные для подписания), ContainerName (имя контейнера закрытого ключа сертификата), вызвать метод Sign() . После чего в поле CertificateAsPEM попадёт соответствующий закрытому ключу сертификат в Base64, а в поле BESignatureValueAsBase64 значение подписи в виде Base64-строки.

Объект XMLCanonicalizer для каноникализации XML

Содержит поля XMLContent (тип "строка"), CanonicalXML (тип "строка"), метод C14NExc() . Для получения канонической формы XML нужно означить XMLContent , вызвать C14NExc() , получить результат из поля CanonicalXML .

Структура XML-подписи

Создание подписи выглядит следующим образом: сначала формируется основа soap-пакета, узлы Header и Body . Body заполняется данными и добавляется атрибут wsu:ID="Body" - идентификатор подписываемых данных.

Заполнение структуры Security происходит в следующем порядке:

  1. Берётся значение хэш-функции от узла Body в каноническом виде и помещается в узел DigestValue.
  2. Узел SignedInfo приводится к каноническому виду, подписывается ЭП. Результат в формате Base64-строки попадает в узел SignatureValue .
  3. Открытый ключ сертификата, которым было выполнено подписание помещается в узел BinarySecurityToken в формате строки Base64.

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

  1. получить каноническую форму элемента SignedInfo .
  2. С использованием резльтата предыдущего шага проверить, действительно ли значение ЭП из узла SignatureValue с помощью открытого ключа сертификата. На данном этапе проверяется только корректность ЭП, что не гарантирует неизменность данных.
  3. Если проверка действительности ЭП пройдена успешно, сравнивается хэш из узла DigestValue и хэш от узла с данными. Если они неравны, то подписанные данные изменены и вся ЭП недействительна.

Пример использования

Пакет разработки и библиотека

Примеры подписания XML на ISBL (сценарий): dev.zip (5,95 Кб)

Для постоянного использования код, выполняющий типовое подписание готового SOAP-конверта, вынесен в функцию SignSOAP() .

Для подписания используется сертификат из личного хранилища сертификатов текущего пользователя.

Статьи по теме: