Фокус в том, что если есть верные подписанные файлы, то реализовать проверку и по ней калибровать подписание проще чем вслепую настраивать подписание. По крайней мере, я сначала делал проверку, так как был доступ к запросам в действующей региональной ИС. В смэв есть запросы, подписанные подписью, но без "чувствительных" данных. Особенно в СМЭВ 3 при работе с ГИС ГМП - там на 1 запрос с данными приходится куча подтверждений получения и частенько ответ "новых платежей нет". Если нужно для отладки проверки могу прислать такой запрос платежей и ответ, подписанные по гост-2012 (есть ответы гис гмп из тестовой смэв 2 и продуктивной смэв 3).
Вообще с файлом есть несколько нюансов: я предполагал в ответе что подписывается запрос в актуальную СМЭВ (СМЭВ 3), а тут запрос в формате СМЭВ 2. Предполагал СМЭВ 3, так как сервисы в СМЭВ 2 поэтапно закрывают, в том числе сервис ГИС ГМП, для которого пример файла первоначально обещали закрыть 1 ноября 2018 года, но уже несколько раз переносили, сейчас речь о 31 декабря 2020 года. От этого зависит местоположение подписи, способ указания сертификата, какое место документа подписано и какие трансформы. Кроме того, там еще есть заготовка второй подписи (подписи начисления). Содержимое начисления также странное в нескольких местах - пока опустим для ясности. Если это только для отладки подписания в уже рабочей системе - пойдет, но если только планируете работать в ГИС ГМП лучше подготовиться к СМЭВ 3.
Конкретно по проверочным пунктам (я не использую штатные функции XML, а собственный вариант вырезания фрагмента и каноникализации, поэтому есть еще несколько пунктов. Цитирую из лога, который определяется Блокнотом как win-1251, потому кириллица utf-8 в боди выглядит неверно): выделено значение подписи, успешно найден и выделен сертификат, выделен фрагмент
Код:<ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><ds:Reference URI="#body"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></ds:Transforms><ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><ds:DigestValue>lDLx3a68Rc4Eb3yt4jap6tcW8jJNa9Z7ox+eXqJzSBc=</ds:DigestValue></ds:Reference></ds:SignedInfo>
для него выделены вышестоящие теги
Код:<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:actor="http://smev.gosuslugi.ru/actors/smev"><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="ID_20200728-2020-0000-0184-30544B43564B-S"><ds:SignedInfo>
из вышестоящих тегов получен "контекст предков" для добавления понадобившихся в каноникализации пространств имен в сам фрагмент, применена нормализация переводов строк (в данном случае ничего не изменилось), применены решения о сохранении объявлений пространств имен в порядке закрытия тегов (первая строка TRY GET ANCESTOR NS о получении отсутствующего пространства имен для префикса ds из контекста предков, при этом оно сохранено PRESERVE в самом верхнем теге и удалено REMOVE из подчиненных).
Код:TRY GET ANCESTOR NS [ds]
[ds:CanonicalizationMethod] [ds]: REMOVE ANCDECL
Build namespace[<ds:CanonicalizationMethod]
[ds:SignatureMethod] [ds]: REMOVE ANCDECL
Build namespace[<ds:SignatureMethod]
[ds:Transform] [ds]: REMOVE ANCDECL
Build namespace[<ds:Transform]
[ds:Transforms] [ds]: REMOVE ANCDECL
Build namespace[<ds:Transforms]
[ds:DigestMethod] [ds]: REMOVE ANCDECL
Build namespace[<ds:DigestMethod]
[ds:DigestValue] [ds]: REMOVE ANCDECL
Build namespace[<ds:DigestValue]
[ds:Reference] [ds]: REMOVE ANCDECL
Build namespace[<ds:Reference]
[ds:SignedInfo] [ds] [34]: PRESERVE 2 1 1
Build namespace[<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"]
в результате вышел каноничный текст
Код:<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod><ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"></ds:SignatureMethod><ds:Reference URI="#body"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"></ds:DigestMethod><ds:DigestValue>lDLx3a68Rc4Eb3yt4jap6tcW8jJNa9Z7ox+eXqJzSBc=</ds:DigestValue></ds:Reference></ds:SignedInfo>
Для него посчитан хэш гост-2012 прямым обращением к Microsoft CryptoApi, код алгоритма 32801, значение хэша (которое запрашивать не обязательно), перевернутое значение на всякий случай и перевернутое RAW значение подписи (в моем случае переворот значения подписи нужен):
Код:0661 4C67 E416 27BE 5920 8612 E0B3 E356 16A8 7A69 365E 6E67 67A9 37D9 1017 2274
BmFMZ+QWJ75ZIIYS4LPjVhaoemk2Xm5nZ6k32RAXInQ=
7422 1710 D937 A967 676E 5E36 697A A816 56E3 B3E0 1286 2059 BE27 16E4 674C 6106
dCIXENk3qWdnbl42aXqoFlbjs+AShiBZvicW5GdMYQY=
5ED7 6207 BD8B 542C 96EE A285 F14C A242 256B CF2F 8963 C746 7C86 E636 60DE 3FB0 1C7B E104 8D86 A2D7 2192 8704 8DCF 3177 D744 EFA5 962E ADD0 4BA9 6437 8A40 6C99
XtdiB72LVCyW7qKF8UyiQiVrzy+JY8dGfIbmNmDeP7Ace+EEjYai1yGShwSNzzF310TvpZYurdBLqWQ3ikBsmQ==
Результат: значение не верно. Причина неизвестна - нужно знать канонический текст и значение хэша при подписании для выводов о причине.
Если канонический текст/хэш другой - дело в тексте/хэше, если текст и хэш те же, то дело или в перевороте значения или включен не тот сертификат.
Можно на этом заканчивать проверку, но для отладки продолжаю проверку референсов, фрагмент
Код:<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="body"><smev:GISGMPTransferMsg xmlns:smev="http://roskazna.ru/gisgmp/02000000/SmevGISGMPService/"><rev:Message xmlns:rev="http://smev.gosuslugi.ru/rev120315"><rev:Sender><rev:Code>RKZN01001</rev:Code><rev:Name>Казначейство Р РѕСЃСЃРёРё</rev:Name></rev:Sender><rev:Recipient><rev:Code>RKZN01001</rev:Code><rev:Name>Казначейство Р РѕСЃСЃРёРё</rev:Name></rev:Recipient><rev:ServiceName>GISGMP</rev:ServiceName><rev:TypeCode>GFNC</rev:TypeCode><rev:Status>REQUEST</rev:Status><rev:Date>2020-07-28T13:47:38</rev:Date><rev:ExchangeType>6</rev:ExchangeType></rev:Message><rev:MessageData xmlns:rev="http://smev.gosuslugi.ru/rev120315"><rev:AppData><gisgmp:RequestMessage xmlns:gisgmp="http://roskazna.ru/gisgmp/xsd/116/Message" xmlns:pdr="http://roskazna.ru/gisgmp/xsd/116/PGU_DataRequest" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" senderIdentifier="" senderRole="2" Id="ID_20200728-2020-0000-0184-30544B43564C" timestamp="2020-07-28T13:47:38"><msgd:ImportRequest xmlns:msgd="http://roskazna.ru/gisgmp/xsd/116/MessageData"><pir:Package xmlns:pir="http://roskazna.ru/gisgmp/xsd/116/PGU_ImportRequest"><pir:Document originatorID="001dc3"><chg:Charge xmlns:chg="http://roskazna.ru/gisgmp/xsd/116/Charge" Id="ID_20200728-2020-0000-0184-30544B43564B" supplierBillID="0000761920041500000001849" billDate="2020-04-15"><chg:ValidUntil>2020-05-15</chg:ValidUntil><chg:SupplierOrgInfo><org:Name xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization">Управление имущественных отношений Брянской области</org:Name><org:INN xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization">3250059309</org:INN><org:KPP xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization">325701001</org:KPP><org:OGRN xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization">1053244057085</org:OGRN><org:Account xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization"><org:AccountNumber>40101810300000010008</org:AccountNumber><org:Bank><org:Name>Отделение Брянск</org:Name><org:BIK>041501001</org:BIK></org:Bank></org:Account></chg:SupplierOrgInfo><chg:BillFor>safdsfgsdfgsdfg</chg:BillFor><chg:TotalAmount>15000</chg:TotalAmount><com:ChangeStatus xmlns:com="http://roskazna.ru/gisgmp/xsd/116/Common" meaning="1"/><chg:KBK>00000000000000000120</chg:KBK><chg:OKTMO>15701000</chg:OKTMO><chg:BudgetIndex><bdi:Status xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">13</bdi:Status><bdi:Purpose xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">0</bdi:Purpose><bdi:TaxPeriod xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">ГД.00.2020</bdi:TaxPeriod><bdi:TaxDocNumber xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">0</bdi:TaxDocNumber><bdi:TaxDocDate xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">0</bdi:TaxDocDate><bdi:PaymentType xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">0</bdi:PaymentType></chg:BudgetIndex><chg:AltPayerIdentifier>0100000000000000000000643</chg:AltPayerIdentifier><chg:PayerName>Селиванова Рќ Р’ 0 Рі.СЂ.</chg:PayerName><chg:TreasureBranch>УФК РїРѕ Брянской области</chg:TreasureBranch><chg:LSvFO>04272004820</chg:LSvFO><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="ID_20200728-2020-0000-0184-30544B43564B-S"><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="#ID_20200728-2020-0000-0184-30544B43564B"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/><ds:DigestValue/></ds:Reference></ds:SignedInfo><ds:SignatureValue/><ds:KeyInfo><ds:X509Data><ds:X509Certificate></ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature></chg:Charge></pir:Document></pir:Package></msgd:ImportRequest></gisgmp:RequestMessage></rev:AppData></rev:MessageData></smev:GISGMPTransferMsg></soapenv:Body>
вышестоящие до фрагмента
Код:<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="body">
, решения пропущу, есть строка TRY GET ANCESTOR NS [soapenv] для недостающего пространства имен, результат
Код:<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="body"><smev:GISGMPTransferMsg xmlns:smev="http://roskazna.ru/gisgmp/02000000/SmevGISGMPService/"><rev:Message xmlns:rev="http://smev.gosuslugi.ru/rev120315"><rev:Sender><rev:Code>RKZN01001</rev:Code><rev:Name>Казначейство Р РѕСЃСЃРёРё</rev:Name></rev:Sender><rev:Recipient><rev:Code>RKZN01001</rev:Code><rev:Name>Казначейство Р РѕСЃСЃРёРё</rev:Name></rev:Recipient><rev:ServiceName>GISGMP</rev:ServiceName><rev:TypeCode>GFNC</rev:TypeCode><rev:Status>REQUEST</rev:Status><rev:Date>2020-07-28T13:47:38</rev:Date><rev:ExchangeType>6</rev:ExchangeType></rev:Message><rev:MessageData xmlns:rev="http://smev.gosuslugi.ru/rev120315"><rev:AppData><gisgmp:RequestMessage xmlns:gisgmp="http://roskazna.ru/gisgmp/xsd/116/Message" Id="ID_20200728-2020-0000-0184-30544B43564C" senderIdentifier="" senderRole="2" timestamp="2020-07-28T13:47:38"><msgd:ImportRequest xmlns:msgd="http://roskazna.ru/gisgmp/xsd/116/MessageData"><pir:Package xmlns:pir="http://roskazna.ru/gisgmp/xsd/116/PGU_ImportRequest"><pir:Document originatorID="001dc3"><chg:Charge xmlns:chg="http://roskazna.ru/gisgmp/xsd/116/Charge" Id="ID_20200728-2020-0000-0184-30544B43564B" billDate="2020-04-15" supplierBillID="0000761920041500000001849"><chg:ValidUntil>2020-05-15</chg:ValidUntil><chg:SupplierOrgInfo><org:Name xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization">Управление имущественных отношений Брянской области</org:Name><org:INN xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization">3250059309</org:INN><org:KPP xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization">325701001</org:KPP><org:OGRN xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization">1053244057085</org:OGRN><org:Account xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization"><org:AccountNumber>40101810300000010008</org:AccountNumber><org:Bank><org:Name>Отделение Брянск</org:Name><org:BIK>041501001</org:BIK></org:Bank></org:Account></chg:SupplierOrgInfo><chg:BillFor>safdsfgsdfgsdfg</chg:BillFor><chg:TotalAmount>15000</chg:TotalAmount><com:ChangeStatus xmlns:com="http://roskazna.ru/gisgmp/xsd/116/Common" meaning="1"></com:ChangeStatus><chg:KBK>00000000000000000120</chg:KBK><chg:OKTMO>15701000</chg:OKTMO><chg:BudgetIndex><bdi:Status xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">13</bdi:Status><bdi:Purpose xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">0</bdi:Purpose><bdi:TaxPeriod xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">ГД.00.2020</bdi:TaxPeriod><bdi:TaxDocNumber xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">0</bdi:TaxDocNumber><bdi:TaxDocDate xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">0</bdi:TaxDocDate><bdi:PaymentType xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">0</bdi:PaymentType></chg:BudgetIndex><chg:AltPayerIdentifier>0100000000000000000000643</chg:AltPayerIdentifier><chg:PayerName>Селиванова Рќ Р’ 0 Рі.СЂ.</chg:PayerName><chg:TreasureBranch>УФК РїРѕ Брянской области</chg:TreasureBranch><chg:LSvFO>04272004820</chg:LSvFO><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="ID_20200728-2020-0000-0184-30544B43564B-S"><ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod><ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"></ds:SignatureMethod><ds:Reference URI="#ID_20200728-2020-0000-0184-30544B43564B"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"></ds:DigestMethod><ds:DigestValue></ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue></ds:SignatureValue><ds:KeyInfo><ds:X509Data><ds:X509Certificate></ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature></chg:Charge></pir:Document></pir:Package></msgd:ImportRequest></gisgmp:RequestMessage></rev:AppData></rev:MessageData></smev:GISGMPTransferMsg></soapenv:Body>
Хэш гост-2012 от него и перевернутый хэш
Код:DE61 26EC 366E 0D50 D073 D08A 84FB B40C 67F1 EFF4 F984 5FE3 28DD B7C7 6D90 5D14
3mEm7DZuDVDQc9CKhPu0DGfx7/T5hF/jKN23x22QXRQ=
FF2Qbce33SjjX4T59O/xZwy0+4SK0HPQUA1uNuwmYd4=
значение DigestValue: lDLx3a68Rc4Eb3yt4jap6tcW8jJNa9Z7ox+eXqJzSBc=, вывод хэш первого референса не совпадает (причем дело в каноничном тексте, а не в перевороте значения), больше референсов нет, подпись не верна.
Для второй подписи соответственно каноничный текст референса:
Код:<chg:Charge xmlns:chg="http://roskazna.ru/gisgmp/xsd/116/Charge" Id="ID_20200728-2020-0000-0184-30544B43564B" billDate="2020-04-15" supplierBillID="0000761920041500000001849"><chg:ValidUntil>2020-05-15</chg:ValidUntil><chg:SupplierOrgInfo><org:Name xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization">Управление имущественных отношений Брянской области</org:Name><org:INN xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization">3250059309</org:INN><org:KPP xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization">325701001</org:KPP><org:OGRN xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization">1053244057085</org:OGRN><org:Account xmlns:org="http://roskazna.ru/gisgmp/xsd/116/Organization"><org:AccountNumber>40101810300000010008</org:AccountNumber><org:Bank><org:Name>Отделение Брянск</org:Name><org:BIK>041501001</org:BIK></org:Bank></org:Account></chg:SupplierOrgInfo><chg:BillFor>safdsfgsdfgsdfg</chg:BillFor><chg:TotalAmount>15000</chg:TotalAmount><com:ChangeStatus xmlns:com="http://roskazna.ru/gisgmp/xsd/116/Common" meaning="1"></com:ChangeStatus><chg:KBK>00000000000000000120</chg:KBK><chg:OKTMO>15701000</chg:OKTMO><chg:BudgetIndex><bdi:Status xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">13</bdi:Status><bdi:Purpose xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">0</bdi:Purpose><bdi:TaxPeriod xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">ГД.00.2020</bdi:TaxPeriod><bdi:TaxDocNumber xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">0</bdi:TaxDocNumber><bdi:TaxDocDate xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">0</bdi:TaxDocDate><bdi:PaymentType xmlns:bdi="http://roskazna.ru/gisgmp/xsd/116/BudgetIndex">0</bdi:PaymentType></chg:BudgetIndex><chg:AltPayerIdentifier>0100000000000000000000643</chg:AltPayerIdentifier><chg:PayerName>Селиванова Рќ Р’ 0 Рі.СЂ.</chg:PayerName><chg:TreasureBranch>УФК РїРѕ Брянской области</chg:TreasureBranch><chg:LSvFO>04272004820</chg:LSvFO></chg:Charge>
хэш гост-94 как указано во второй подписи должен быть wwB127yMeVEcAVXbaW+8HSxVWFlQLRdQciU3oA8v8Us=, хэш гост-2012 wzvCC/QpsMFl3f0usHQfOU/NOYn2gqiNSCFfIg1O1+4=
Отредактировано пользователем 30 июля 2020 г. 7:07:10(UTC)
| Причина: Не указана