Посмотрел файлы. Какая-то смесь разных требований если честно, пройти может только первый этап проверки подписи (проверка правильности SignatureValue), хэши в таком виде документа не могут сойтись. Попробую их проверить чуть позже, слегка изменив документ, а пока перечислю странности документа.
1.
При таком положении электронной подписи она просто не может быть enveloped signature, трансформ сработает вхолостую и не удалит тег Signature, так как у Signature родительский тег одновременно является потомком для SOAP:envelope, а трансформ удаляет только теги Signature, которые прямые потомков подписываемого тега SOAP:Envelope без промежуточных тегов, а не все теги Signature какие есть в документе. Это можно решить помещением тега Signature в конец документа перед </SOAP:Envelope>. Подпись от SOAP:Envelope по стандартам просто невозможно поместить в SenderInformationSystemSignature без более заковыристых трансформов xpath (убирающих все теги подписей) либо нарушения подписи, но xpath поддерживается далеко не везде и сторонние средства могут выдавать ошибку, даже если ИС примет документ. Поэтому вряд ли ИС будет предъявлять требования поместить в SenderInformationSystemSignature подпись от SOAP:Envelope, тут какое-то недопонимание.
Исправлено: после перепрочтения текста стандарта в сообщении ниже уже не уверен в своем понимании трансформа enveloped signature, поэтому убрано в спойлерЕще отмечу, что несмотря на удаление тега Signature и вложенных в него тегов трансформом enveloped signature, в подписываемом тексте должны сохранятся все остальные теги. В данном случае я вижу что в строке для подписи отсутствует тег SenderInformationSystemSignature, по стандартам он должен присутствовать (пусть и пустой), так как он тоже не удалится трансформом enveloped signature.
2. Важно то, что CanonicalizationMethod Algorithm применяется только к SignedInfo перед выработкой SignatureValue и ничего не говорит о каноникалилации тега на который ссылается референс перед вычислением DigestValue. Поэтому если Вы текст документа за исключением текущей подписи каноникализируете, то в трансформах должен присутствовать и метод каноникализации. Иначе при проверка каноникализация скорее всего не будет выполнена и получится другой хэш.
В принципе проверяющая сторона может выбрать некий алгоритм каноникализации по умолчанию, который используется когда никакого не указано. Например, чтобы проверить все примеры разных ГИС моя программа подбирает трансформ каноникализации хэша когда никакого не указано в трансформах референса, но выдает предупреждение что фактически использован такой-то алгоритм каноникализации при том что никакого не указано. Однако это уже натяжка стандарта под конкретные ГИС, лучше укаать явно какой алгоритм каноникализации Вы использовали перед вычислением хэша чтобы проверка точно прошла успешно.
Сразу скажу по порядку трансформов когда их несколько в одном референсе: в случае присутствия трансформа enveloped signature сначала указавается enveloped signature потом метод каноникализации. Если присутствует смэвовский трансформ он указывается после канононикализации. При другом порядке трансформы дают неожиданный результат.
3. Формат начиная с RequestMessage очень напоминает схемы СМЭВ3 (хотя и отличия есть, например MessageID не по требования смэв3 из метки времени и мак адреса, а сгенерирован случайно), по которым в SenderInformationSystemSignature помещается подпись от элемента SenderProvidedRequestData, а не от SOAP:Envelope.
Возможно нужно наложить две подписи - одну по требованиям смэв (в SenderInformationSystemSignature поместить подпись от элемента SenderProvidedRequestData с определенными смэв трансформами: исключающая каноникализация и смэвовский, при этом SenderProvidedRequestData должен иметь Id начинающийся с буквы и этот Id указывается в референс ури после решетки), вторую в конце документа, перед </SOAP:Envelope> с URI="" и трансформами: enveloped signature и каконикализацией. Обратите внимание, что при наложении подписей на теги вложенные один в другой важно соблюдать порядок наложения подписей - сначала подписать вложенный тег потом обрамляющий тег (но без исключения подписи вложенного тега).
Другой вариант - что вторая подпись накладывается на какой-то другой из тегов (SOAP:Body или EPLTSAddData или RequestMessage). Это все же нужно уточнить в требованиях предъявляемых конкретной ИС. Либо все-таки какой-то правильный пример из руководства пользователя хотелось бы посмотреть чтобы не гадать.
Отредактировано пользователем 22 мая 2019 г. 12:19:14(UTC)
| Причина: Не указана