SMEV-100003 и философияРазбираясь, что я делаю не так наткнулся на документ: "Коды ошибок СМЭВ.pdf"
А в нем написано: SMEV-100003 SMEV-200003 Неверная ЭП сообщения
Проверка сообщения с помоью функционала на ТП СМЭВ "Инструменты разработки сервисов"
http://smev.gosuslugi.ru/portal/services-tools.jspСходил туда, подсунул для проверки свой запрос,
получил: Ошибка разбора XML сообщения [Content is not allowed in prolog.]
Круто, но неинформативно.
О возможных ошибках возникновения SMEV-100003 написано:
1. Содержимое подписываемого тега изменено после подписания.
-А какого тега? Как я понимаю речь идет о <ds:Reference URI="#body"> Не менял, клянусь!
2. Используемые ОИВом библиотеки инвертируют подпись.
В этом случае необходимо побитово инвертировать подпись перед внесением в XML.
-Т.е. при расчете я, как ОИВ, (ух какие высоты, я и Орган Испонительной власти)
получаю инвертированную подпись?
Опять мимо, для версии 1,15 все проверялось успешно.
Таким образом, данное сообщение об ошибке говорит о том, что запрос,
который Вы отсылаете к сервису имеет некорректную ЭЦП.
-Ну как с этим спорить?
Проверка подписи происходит следующим образом:
- в СМЭВ поступает запрос;
- канонизируется элемент SignedInfo с помощью алгоритма c14n;
- далее расшифровывается SignatureValue с помощью открытого ключа сертификата - x1;
- берется SignedInfo и считается от него хэш - x2,
если x1 не равен x2, СМЭВ возвращает ошибку <Неверная ЭП сообщения.
Если же х1 = х2, то проверка переходит на следующий шаг;
- считается хэш от body запроса - y1 по методу
указанному в DigestMethod. Из DigestValue
получаем - y2. Если y1 не равен y2, то СМЭВ
возвращает ошибку "Неверная ЭП сообщения"
Тут я начал кое что понимать, но кипит наш разум возмущенный.
С какого бодуна SignatureValue содержит подпись всего <SignedInfo>
Всегда считал что это подпись элеменета <ds:DigestValue>
Ситаем сигнатуру классом public class SmevSignedXml : SignedXml
или классом public class SignedXmlPrefix : SignedXml
получаем :
Код:<?xml version="1.0" encoding="windows-1251"?>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411" />
<ds:Reference URI="#body">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
<ds:DigestValue>Fr1MXW4nvHaQHR8xZ1HkETrsfequYcLjv9qVrCBxuv4=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>XB6D2Gj3iilbaKz+re6j2mQiGQQD0b/iS3H9SHFtHENlXH8Qvhly3C07/QfPGCas6fKbPLNfjChfgNaGf2A9yQ==</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>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</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
В классе SignedXmlPrefix я не до конца уверен т.к.
Код:public XmlElement GetXml(string prefix)
{ XmlElement e = this.GetXml(); SetPrefix(prefix, e); return e;}
т.е. все правится добавлением префикса после расчета сингатуры...
И тут начинася самое интересное
Смотрим "Методические рекомендации по разработке веб-сервисов v2.5.6.pdf"
видим слова про TimeStamp и XAdES
в пункте 4,2,2 не видим никаких префиксов для <Signature>
но в примере к этому пункту все с префиксом.
Далее смотрим пункт 5.2.1. видим:
"Так как электронная подпись узла СМЭВ/РСМЭВ содержит метку времени, для её
хранения в электронном сообщении используется расширение стандарта XMLDSIG - XAdES-T."
Все приплыли, смотрим пример и пухнем дальше:
Код: <ds:Object>
<xds:QualifyingProperties xmlns:xds="http://uri.etsi.org/01903/v1.1.1#">
...
<xds:HashDataInfo uri="#signature-value-40ddb6ca-9ac1-4026-a049-76901f3aa5d8"/>
<xds:EncapsulatedTimeStamp>Метка времени в Base64</xds:EncapsulatedTimeStamp>
видим у xds:HashDataInfo ссылку на то для чего берется TimeStamp
т.е. значение сигнатуры но в примере у элемента <ds:SignatureValue>
нет атрибута Id=signature-value-40ddb6ca-9ac1-4026-a049-76901f3aa5d8
Бардак однако.
И соответственно я поступил по простому, добавил к <ds:SignatureValue>
атрибут Id и соответственно в xds:HashDataInfo ссылку на него.
Вроде ничего криминального <ds:SignedInfo> я не трогаю.
Однако все равно получаю SMEV-100003
Я конечно не Чернышевский, но
ЧТО ДЕЛАТЬ?
Все вручную? Повторить то, что сделала КриптоПро в КриптоПро.NET?
PS Маленькая шпилька для автора SignedXmlPrefix
Если атрибут у элемента <soapenv:Body Id="body">
имеет префикс т.е. <soapenv:Body wsu:Id="body">
получаем апшибку при определении ссылки
m.Invoke(this, new object[] { });
Как быть тут?