Автор: Соня Базурова Никак не получается сформировать корректный xml-пакет (отправка начисления). При проверке на портале
https://smev3.gosuslugi....portal/checkxmlform.jsp, результат:
ЭЦП не подтверждена: #I_54a59db2-3845-4915-8770-dd95394aadb1 Ошибка проверки ЭП: Нарушена целостность ЭП
MS .Net версии 3.5.
Подписываю так:
Код:
references[0] = "I_54a59db2-3845-4915-8770-dd95394aadb1";
references[1] = "SIGNED_BY_CALLER";
.Net желательно версии 4.5 или выше для корректного выполнения приведения к каноническому виду, ранние версии не выполняют всех требований стандарта XmlDsigExcC14NTransform, поэтому некоторые файлы могут проходить проверку, а некоторые нет.
Сам подписанный файл пока не смотрел, уже по этим строкам есть что сказать: создали одну подпись и свалили в нее все референсы. Смысл в том, что у Вас референсы пересекаются (1-й содержит 0-й) и при подписи одного может меняться другой из-за указания enveloped трансформа. Поэтому обратите внимание, что они не совместимы в одной подписи с такими трансформами, а каждый референс должен добавляться к отдельной подписи.
Подписание очень чувствительно к порядку операций и к указываемых в reference идентификаторах подписываемых узлов. Правильный порядок следующий:
шаг 1) подписываете начисление, в данном случае идентификатор "I_54a59db2-3845-4915-8770-dd95394aadb1". В СМЭВ 2 это было обязательно, но в СМЭВ 3 я что-то не вижу подписи в схеме данных. В спойлере информация об этой подписи в смэв2.
подписью с расширением xades-T. Как я понимаю, это enveloped подпись и помещается внутрь "I_54a59db2-3845-4915-8770-dd95394aadb1". XmlDsigSmevTransform по идее не нужно, но нужен дополнительный референс на xades данные (скорее всего будет сформирован автоматически если создавать xades-T). В некоторых примерах и вовсе выходит что начисление извлекли в отдельный документ, потом подписали его целиком указав URI="", потом вставили в пакет начислений. Сама ГИС ГМП хранит каждое начисление в кодированном виде отдельно от других начислений, поэтому тег начисления должен быть "самодостаточным", то есть содержать все объявления используемых пространств имен. Самодостаточность как раз позволяет извлечь начисление куда-то и подписать отдельно от остальных или хранить отдельно или проверять его подпись отдельно. Пока похоже что ГИС ГМП не проверяет чего там подписали и в формате ли xades-T, тестовый ли сервер доверенного времени и т.д., важен сам факт наличия хоть какой-то подписи у начисления. Повторяете шаг для каждого начисления.
шаг 2) подписываете тег под MessagePrimaryContent, в данном случае ImportChargesRequest с идентификатором "G_fce0c544-b08d-44bc-83d8-738f10e9d069" Этот тег содержит в себе все начисления, поэтому если сделать шаг 2 ранее чем шаг 1, то при шаге 1 содержимое изменится и подпись не пройдет проверку. Эта подпись помещается в PersonalSignature. Поэтому XmlDsigEnvelopedSignatureTransform не нужен. По схеме эта подпись не обязательная для теста можно пропустить шаг.
шаг 3) Обязательный. Подписываете SenderProvidedRequestData с идентификатором "SIGNED_BY_CALLER" и помещаете подпись в CallerInformationSystemSignature. Тут на первый взгляд все сделано верно, надо только выкинуть референс на начисление "I_54a59db2-3845-4915-8770-dd95394aadb1" и XmlDsigEnvelopedSignatureTransform. Либо можно попробовать референс "I_54a59db2-3845-4915-8770-dd95394aadb1" оставить, но XmlDsigEnvelopedSignatureTransform убрать из обоих референсов.
К слову, если использовать все три трансформа, Enveloped должен добавляться самым первым (уменьшает объем данных, но при уменьшении может испортить каноническую форму и смэвовскую форму), потом C14N (может как уменьшить, так и увеличить объем данных, убирает переводы строк и табуляцию в самом теге, но портит с высокой степенью вероятности смэвовскую форму), потом смэвовский трансформ (переставляет объявление пространства имен тега в начало, исправляет возможную проблему с переводами строк и табуляциями путем их удаления, однако если атрибуты были разделены переводами строк и табуляциями, то без выполнения трансформа C14N перед смевовским получится нечитаемая каша). В порядке
Код:исходные данные -> Enveloped -> C14N -> смэвовский -> данные для хэша
они друг другу не мешают.
По тексту документа, кажется должно быть chg:Payee, tns:MessagePrimaryContent и обязателен тег
Код:<chg:ChangeStatus meaning="1"/>
Ещё нюанс - с тегом TestMessage ответ будет от тестового эмулятора, а эмулятор отвечает штатно только на заданный в примере идентификатор платежа или начисления.
Отредактировано пользователем 15 марта 2019 г. 12:34:24(UTC)
| Причина: Не указана