Делаю интеграцию с веб-сервисом системы маркировки ювелирных изделий ГИИС ДМДК (https://dmdk-exch.goznak.ru/ws/v1/exchange.wsdl, основной сайт
https://dmdk.ru).
В соответствии с документацией на ГИИС настроил stunnel, тестовый запрос к методу health из SoapUI работает нормально.
Но когда пытаюсь отправить запрос с подписью - возникают проблемы, бьюсь уже несколько дней с вот такой ошибкой:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring xml:lang="en">Error validate signature : -13</faultstring>
<detail>
<ErrorDetailType xmlns:ns2="urn://xsd.dmdk.goznak.ru/exchange/1.0">
<ns2:code>VerifySignature</ns2:code>
<ns2:msg>Error validate signature : -13</ns2:msg>
</ErrorDetailType>
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
В ТЗ от сервиса говорится (цитата):
Подпись формируется по стандарту XMLDSig (https://www.w3.org/TR/xmldsig-core1/).
Тип подписи – detached signature (отделенная подпись).
Над подписываемым XML-узлом RequestData осуществляются
преобразования
http://www.w3.org/2001/10/xml-exc-c14n# и urn://smevgov-ru/xmldsig/transform
Ошибка 13 означает "алгоритм формирования подписи не является ГОСТ 34.10-2001_256 или ГОСТ 34.10-2012_256".
Попытался написать код на VBA, в котором беру значимую часть XML и подписываю обезличенным сертификатом через CAdESCOM.SignedXML:
<ns:RequestData id="body">
<ns:count>5</ns:count>
<ns:country>643</ns:country>
</ns:RequestData>
В полученный ответ добавляю все неймспейсы, как в примере из документации, получается вот такой XML, на который и выдается ошибка 13:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns = "urn://xsd.dmdk.goznak.ru/exchange/1.0"
xmlns:ns1 = "urn://xsd.dmdk.goznak.ru/batch/1.0"
xmlns:ns2 = "urn://xsd.dmdk.goznak.ru/contractor/1.0"
xmlns:ns3 = "urn://xsd.dmdk.goznak.ru/types/1.0">
<soapenv:Header/>
<soapenv:Body>
<ns:SendReserveBatchUicRequest>
<ns:CallerSignature>
<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="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:Transform Algorithm="urn://smev-gov-ru/xmldsig/transform"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>
<ds:DigestValue>Q4zvchuFJ96Jalp4jYXKDBwPiOZ3M8cGSm5GRPhF/1Q=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>HLdN1ofWuEtlf8++9QI3emh+zggps0o2uUTUpmuDl6CnmaRgeveisN2njZD6rcnxmjOSzjTZtALhpg9fBif3Q==</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>данные удалил, но они были</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</ns:CallerSignature>
<ns:RequestData id="body">
<ns:count>5</ns:count>
<ns:country>643</ns:country>
</ns:RequestData>
</ns:SendReserveBatchUicRequest>
</soapenv:Body>
</soapenv:Envelope>
Попытался создать и подписать XML, чтобы всё проверить вручную при помощи страницы
https://www.cryptopro.ru...des_xmldsig_sample.html, но при таком подходе теряются неймспейсы, а подпись добавляется в самый конец XML и ГИИС выдает ошибку.
Подскажите, как мне сформировать корректную подпись для ГИИС ДМДК (вручную или на VBA)?
Может, можно как-то формировать подпись при помощи CAdESCOM.CadesSignedData, как делаю для другой системы маркировки Честный Знак (и там всё отлично работает)?
Заранее спасибо!