Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Georgy OGANDZHANOV  
#1 Оставлено : 10 января 2022 г. 11:11:23(UTC)
Georgy OGANDZHANOV

Статус: Новичок

Группы: Участники
Зарегистрирован: 19.12.2021(UTC)
Сообщений: 3
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
Делаю интеграцию с веб-сервисом системы маркировки ювелирных изделий ГИИС ДМДК (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, как делаю для другой системы маркировки Честный Знак (и там всё отлично работает)?

Заранее спасибо!
Offline two_oceans  
#2 Оставлено : 10 января 2022 г. 13:16:37(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 394 раз в 366 постах
Добрый день.
Коллега, по поводу примера на VBA, уточните как берете значимую часть? Просто вырезаете текст как в сообщении выше? Вот как упрощенно работает обработка трансформа при проверке:
1) при взятии фрагмента в самый верхний тег фрагмента включаются ВСЕ объявления пространств имен xmlns:... = "..." из вышестоящих тегов. Просто вырезав текст, значимый на первый взгляд, Вы их потеряете;
2) при взятии канонической формы из фрагмента удалятся неиспользуемые объявления пространств имен. Казалось бы "вот оно!", потерялись и скатертью дорога, но у Вас во фрагменте используется то самое объявление пространства имен xmlns:ns = "urn://xsd.dmdk.goznak.ru/exchange/1.0" и оно не удалится при проверке.
3) текст канонической формы разный - получается разный хэш - подпись не верна. Вы подписывали
Код:
<ns:RequestData id="body">
<ns:count>5</ns:count>
<ns:country>643</ns:country>
</ns:RequestData>
а проверка проходит для
Код:
<ns:RequestData xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0" id="body">
<ns:count>5</ns:count>
<ns:country>643</ns:country>
</ns:RequestData>
CAdESCOM.CadesSignedData - это стандарт CAdES, поэтому для xmldsig он не подойдет.
Правильнее использовать режим подписания по шаблону - сразу готовите почти готовые документ с подписью, но пустыми DigestValue SignatureValue. Класс их заполняет и больше ничего не трогаете, отправляете или проверяете.

Отредактировано пользователем 10 января 2022 г. 13:23:19(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Georgy OGANDZHANOV оставлено 11.01.2022(UTC)
Offline Georgy OGANDZHANOV  
#3 Оставлено : 11 января 2022 г. 2:58:04(UTC)
Georgy OGANDZHANOV

Статус: Новичок

Группы: Участники
Зарегистрирован: 19.12.2021(UTC)
Сообщений: 3
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
Добрый день,

Спасибо за ответ.

Попробовал использовать режим подписания по шаблону, однако при вызове CAdESCOM.SignedXML.Sign с CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE получаю ошибку "-2147023430 Ошибка при обработке цифровой подписи XML".
Вот подготовленная мной XML-ка, не могу понять, что именно в ней не так:

<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/>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue/>
<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>

Как узнать подробности об этой ошибке и понять, какой из тегов я подготовил неверно?

Заранее спасибо!
Offline Georgy OGANDZHANOV  
#4 Оставлено : 12 января 2022 г. 21:12:10(UTC)
Georgy OGANDZHANOV

Статус: Новичок

Группы: Участники
Зарегистрирован: 19.12.2021(UTC)
Сообщений: 3
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
Оставлю тут решение, для будущих поколений:

Проблема была в том, что libxml не может найти узел body; однако если привести строку к виду <ns:RequestData xml:id="body"> (т.е. добавить префикс xml), его перестает понимать ГИИС ДМДК.
Кроме того оказалось, что cadescom не умеет трансформ смэв (пришлось удалить <ds:Transform Algorithm="urn://smev-gov-ru/xmldsig/transform"/>).

В итоге результаты поиска решений привели к https://dmdk.ru/upload/i...rmirovaniya-podpisi.zip; Это решение, выполненное на базе проекта https://github.com/AlexMAS/GostCryptography, в который добавили реализацию трансформации СМЭВ (базовая), запись элемента «Signature» с префиксом и методы для доступа через COM. При использовании этой компоненты удалось написать полноценную интеграцию для Excel из-под VBA всего за пару часов ;)
thanks 1 пользователь поблагодарил Georgy OGANDZHANOV за этот пост.
Timujin оставлено 13.01.2022(UTC)
Offline two_oceans  
#5 Оставлено : 13 января 2022 г. 13:35:26(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 394 раз в 366 постах
Автор: Georgy OGANDZHANOV Перейти к цитате
xml:id="body"
Добрый день.
Прокомментирую, что этот атрибут некорректен для трансформа http://www.w3.org/2001/10/xml-exc-c14n# . Причины я уже пояснял подробно на этом форуме, скажу здесь кратко, что трансформ размножит атрибут на все дочерние теги и выйдет совсем не то, что подписывали и уж точно не идентифицирующий атрибут, как Вы задумывали. Для правильной интерпретации атрибута должна быть версия трансформа более поздняя, в которой атрибут id исключен из наследования в дочерние теги.

Однако тут всплывает другая проблема: формат подписания закрепляет какие трансформы должны быть поддержаны обязательно и в первоначальной версии формата подписания естественно нет упоминания о трансформе принятом позже. Тем не менее, это не мешает большинству отечественных ИС ссылаться именно на первоначальный формат и соответственно не поддерживать (как обязательную) новую версию каноникализации. Соответственно ИС впадает в ступор при встрече xml:id с несовместимым трансформом и следовательно данный атрибут несовместим с большинством ИС.

Более корректно добавлять атрибут wsu:Id (и объявление пространства wsu), если конечно это позволяет схема конкретной ИС.

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.