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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Infopol  
#1 Оставлено : 31 марта 2022 г. 11:54:30(UTC)
Infopol

Статус: Активный участник

Группы: Участники
Зарегистрирован: 21.03.2022(UTC)
Сообщений: 33
Откуда: Краснодарский край

Сказал(а) «Спасибо»: 17 раз
Код:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0">
<soapenv:Header></soapenv:Header>
  <soapenv:Body>
    <ns:SendGetBatchRequest>
      <ns:CallerSignature>
<!--You may enter ANY elements at this point-->
      </ns:CallerSignature>
      <ns:RequestData id="body">
        <ns:UIN_INP>1111111111111111</ns:UIN_INP>
      </ns:RequestData>
    </ns:SendGetBatchRequest>
  </soapenv:Body>
</soapenv:Envelope>

Для вычисления хеша беру Body
Код:

 <soapenv:Body>
    <ns:SendGetBatchRequest>
      <ns:CallerSignature>
<!--You may enter ANY elements at this point-->
      </ns:CallerSignature>
      <ns:RequestData id="body">
        <ns:UIN_INP>1111111111111111</ns:UIN_INP>
      </ns:RequestData>
    </ns:SendGetBatchRequest>
  </soapenv:Body>

имею 4 алгоритма хэш функции какой из них использовать не знаю
разные источники HashLib,Capicom,Cadescom,SirCrypt.
Так же разные методы подписания...Какой из них выбрать?
Пробовал GostCryptography.dll,но сервис ГИИС ответил - Внутренняя ошибка.
Что делаю не так?

Вот результат GostCryptography
Код:

<?xml version="1.0"?>

-<soapenv:Envelope xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

<soapenv:Header/>


-<soapenv:Body>


-<ns:SendGetBatchRequest>


-<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:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>

<ds:DigestValue>NIK1I+ye3E9Vt/qgvSM7cISNN1UAvfs5YvY3sWc6kUU=</ds:DigestValue>

</ds:Reference>

</ds:SignedInfo>

<ds:SignatureValue>zvVtAj3a2yR3jV66/K2Wcp/odz8n5wrNJyKxJ2Ujnuko5Ta3+tmahNQvE8RzoIWVwz3EqtIbH1lepOhGyCiBig==</ds:SignatureValue>


-<ds:KeyInfo>


-<ds:X509Data>

<ds:X509Certificate>MIII/TCCCKqg.................Nz0jXw==</ds:X509Certificate>

</ds:X509Data>

</ds:KeyInfo>

</ds:Signature>

<!--You may enter ANY elements at this point-->


</ns:CallerSignature>


-<ns:RequestData id="body">

<ns:UIN_INP>1111111111111111</ns:UIN_INP>

</ns:RequestData>

</ns:SendGetBatchRequest>

</soapenv:Body>

</soapenv:Envelope>

Отредактировано пользователем 31 марта 2022 г. 11:59:43(UTC)  | Причина: Не указана

Offline two_oceans  
#2 Оставлено : 1 апреля 2022 г. 12:12:25(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
Автор: Infopol Перейти к цитате
Для вычисления хеша беру Body
Добрый день.
Опять двадцать пять. Просто для сведения посмотрите аналогичные темы по подписанию SOAP / XMLSDIG / XADES.
Подписание для СМЭВ, таможни, ГИС ЖКХ, больничных для ФСС - со своими завихрениями, но направление одно.
Если очень короткий экскурс по тому что Вы написали выше:
1) старайтесь формировать документы без переводов строк (символов с кодами 13 и 10) и отступов (табуляция 9 или куча пробелов подряд в начале строки) - из-за них очень часто не идут хэши и портится подпись - где-то их автоматика удаляет, где-то нет и потому самое надежное чтобы их вообще не было. Любой браузер покажет с отступами и переносами даже если их в файле нет, так что удобочитаемость человеком не пострадает. Переносы можно проигнорировать только в содержимом сертификата и только если у Вас нет вложенных подписей.
2) когда берете Body надо понимать, что у Вас в Envelope есть куча xmlns:soapenv="..." xmlns:ns="...", а в Body они используются, поэтому обязательно нужно их включить во взятый текст Body. Правильно так:
Код:
<soapenv:Body xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><ns:SendGetBatchRequest><ns:CallerSignature><!--You may enter ANY elements at this point--></ns:CallerSignature><ns:RequestData id="body"><ns:UIN_INP>1111111111111111</ns:UIN_INP></ns:RequestData></ns:SendGetBatchRequest></soapenv:Body>

3) дальше текст должен идти на приведение к каноничному виду - с комментариями или без - уточните в спецификации. В случае эксклюзивной (исключающей) канонической формы без комментариев
Код:
<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><ns:SendGetBatchRequest  xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0"><ns:CallerSignature></ns:CallerSignature><ns:RequestData id="body"><ns:UIN_INP>1111111111111111</ns:UIN_INP></ns:RequestData></ns:SendGetBatchRequest></soapenv:Body>

4) судя по структуре запроса - есть ns:CallerSignature и есть ns:RequestData id="body", я бы предположил что надо брать тег с id="body", а не soapenv:Body, так как подписываемый фрагмент практически всегда имеет атрибут id="...". Уточните в спецификации. Если я прав, то:
Код:
<ns:RequestData xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0" id="body"><ns:UIN_INP>1111111111111111</ns:UIN_INP></ns:RequestData>

Если вручную - каноничную форму подаете на вычисление хэша, с известным значением хэша собираете Reference, из референсов собираете SignedInfo, снова берете фрагмент (SignedInfo), снова к каноничной форме, снова вычисляете хэш и подписываете хэш ключом, результат вносите в SignatureValue. Многие "самоделкины" собирают SignedInfo сразу в каноничном виде (дублируют xmlns:ds="..." для ds:Signature в ds:SignedInfo) и упрощают себе жизнь. Главное не запутаться - если сделать разные префиксы Signature и SignedInfo, то это конечно допустимо, но некоторые средства проверки подписи воспринимают не очень хорошо.

С HashLib,SirCrypt плотно не сталкивался. Capicom все больше устаревает, хотя в основном похоже на Cadescom. В случае Cadescom можно смотреть в сторону специализированных классов по подписанию XML SignedXML(все "из коробки", но может не подойти для конкретной ИС. Тогда есть режим подписания по шаблону - готовите болванку из готового примера для нужной ИС с пустым SignatureValue DigestValue и указываете XPath какой тег Signature надо заполнить - например, если в документе несколько подписей, можно подписав одну с сертификатом 1, указав только ее, потом вторую с сертификатом 2 уже ничего не указывая) или RawSignature (если захотите считать хэш отдельно и собирать подпись вручную).
Подробнее https://cpdn.cryptopro.ru/ Там КриптоПро ЭЦП. Руководство разработчика - Справочник по ЭЦП SDK - Интерфейс COM - Объекты - RawSignature или SignedXML - ссылка для соответствующего интерфейса.

Чтобы посоветовать какую библиотеку выбрать еще желательно знать на каком языке (среде) программирования пишете программу. Рядом с объектами приводятся довольно полные примеры для Javascript, для других сред где можно использовать COM его можно адаптировать по синтаксису. Расширения PHP и Python используют практически тот же интерфейс что и COM. Для Java или C# есть отдельные классы, лезть в COM не нужно, но это уже отдельная история. Еще можно воспользоваться прямыми вызовами CryptoApi.
https://cpdn.cryptopro.r...in-samples-sign-xml.html

Также отмечу, что если делаете для своей организации, то все нормально, но если делаете за деньги для другой организации - это лицензируемая ФСБ деятельность.

UPD. По приложенному результату подписания ничего точно сказать нельзя - закрыт тег Transforms, сокращен сертификат. Похоже что замечание 4) в кассу - подписан только фрагмент с id="body".

Отредактировано пользователем 4 апреля 2022 г. 5:50:42(UTC)  | Причина: опечатка SignedData -> правильно SignedInfo

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Infopol оставлено 07.04.2022(UTC)
Offline Infopol  
#3 Оставлено : 3 апреля 2022 г. 7:42:41(UTC)
Infopol

Статус: Активный участник

Группы: Участники
Зарегистрирован: 21.03.2022(UTC)
Сообщений: 33
Откуда: Краснодарский край

Сказал(а) «Спасибо»: 17 раз
Спасибо большое.Буду разбираться.
Данную задачу решаю в среде "Инфо-Предприятие" 2.0 ,но DLL пишу на Delphi
Offline Infopol  
#4 Оставлено : 7 апреля 2022 г. 21:27:11(UTC)
Infopol

Статус: Активный участник

Группы: Участники
Зарегистрирован: 21.03.2022(UTC)
Сообщений: 33
Откуда: Краснодарский край

Сказал(а) «Спасибо»: 17 раз
Автор: two_oceans Перейти к цитате
Автор: Infopol Перейти к цитате
Для вычисления хеша беру Body
Добрый день.
Опять двадцать пять. Просто для сведения посмотрите аналогичные темы по подписанию SOAP / XMLSDIG / XADES.
Подписание для СМЭВ, таможни, ГИС ЖКХ, больничных для ФСС - со своими завихрениями, но направление одно.
Если очень короткий экскурс по тому что Вы написали выше:
1) старайтесь формировать документы без переводов строк (символов с кодами 13 и 10) и отступов (табуляция 9 или куча пробелов подряд в начале строки) - из-за них очень часто не идут хэши и портится подпись - где-то их автоматика удаляет, где-то нет и потому самое надежное чтобы их вообще не было. Любой браузер покажет с отступами и переносами даже если их в файле нет, так что удобочитаемость человеком не пострадает. Переносы можно проигнорировать только в содержимом сертификата и только если у Вас нет вложенных подписей.
2) когда берете Body надо понимать, что у Вас в Envelope есть куча xmlns:soapenv="..." xmlns:ns="...", а в Body они используются, поэтому обязательно нужно их включить во взятый текст Body. Правильно так:
Код:
<soapenv:Body xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><ns:SendGetBatchRequest><ns:CallerSignature><!--You may enter ANY elements at this point--></ns:CallerSignature><ns:RequestData id="body"><ns:UIN_INP>1111111111111111</ns:UIN_INP></ns:RequestData></ns:SendGetBatchRequest></soapenv:Body>

3) дальше текст должен идти на приведение к каноничному виду - с комментариями или без - уточните в спецификации. В случае эксклюзивной (исключающей) канонической формы без комментариев
Код:
<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><ns:SendGetBatchRequest  xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0"><ns:CallerSignature></ns:CallerSignature><ns:RequestData id="body"><ns:UIN_INP>1111111111111111</ns:UIN_INP></ns:RequestData></ns:SendGetBatchRequest></soapenv:Body>

4) судя по структуре запроса - есть ns:CallerSignature и есть ns:RequestData id="body", я бы предположил что надо брать тег с id="body", а не soapenv:Body, так как подписываемый фрагмент практически всегда имеет атрибут id="...". Уточните в спецификации. Если я прав, то:
Код:
<ns:RequestData xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0" id="body"><ns:UIN_INP>1111111111111111</ns:UIN_INP></ns:RequestData>

Если вручную - каноничную форму подаете на вычисление хэша, с известным значением хэша собираете Reference, из референсов собираете SignedInfo, снова берете фрагмент (SignedInfo), снова к каноничной форме, снова вычисляете хэш и подписываете хэш ключом, результат вносите в SignatureValue. Многие "самоделкины" собирают SignedInfo сразу в каноничном виде (дублируют xmlns:ds="..." для ds:Signature в ds:SignedInfo) и упрощают себе жизнь. Главное не запутаться - если сделать разные префиксы Signature и SignedInfo, то это конечно допустимо, но некоторые средства проверки подписи воспринимают не очень хорошо.

С HashLib,SirCrypt плотно не сталкивался. Capicom все больше устаревает, хотя в основном похоже на Cadescom. В случае Cadescom можно смотреть в сторону специализированных классов по подписанию XML SignedXML(все "из коробки", но может не подойти для конкретной ИС. Тогда есть режим подписания по шаблону - готовите болванку из готового примера для нужной ИС с пустым SignatureValue DigestValue и указываете XPath какой тег Signature надо заполнить - например, если в документе несколько подписей, можно подписав одну с сертификатом 1, указав только ее, потом вторую с сертификатом 2 уже ничего не указывая) или RawSignature (если захотите считать хэш отдельно и собирать подпись вручную).
Подробнее https://cpdn.cryptopro.ru/ Там КриптоПро ЭЦП. Руководство разработчика - Справочник по ЭЦП SDK - Интерфейс COM - Объекты - RawSignature или SignedXML - ссылка для соответствующего интерфейса.

Чтобы посоветовать какую библиотеку выбрать еще желательно знать на каком языке (среде) программирования пишете программу. Рядом с объектами приводятся довольно полные примеры для Javascript, для других сред где можно использовать COM его можно адаптировать по синтаксису. Расширения PHP и Python используют практически тот же интерфейс что и COM. Для Java или C# есть отдельные классы, лезть в COM не нужно, но это уже отдельная история. Еще можно воспользоваться прямыми вызовами CryptoApi.
https://cpdn.cryptopro.r...in-samples-sign-xml.html

Также отмечу, что если делаете для своей организации, то все нормально, но если делаете за деньги для другой организации - это лицензируемая ФСБ деятельность.

UPD. По приложенному результату подписания ничего точно сказать нельзя - закрыт тег Transforms, сокращен сертификат. Похоже что замечание 4) в кассу - подписан только фрагмент с id="body".


Спасибо за ответ. Вот хочу узнать как использовать параметр xPath в функции SignedXML(Signer.xPath).
Подпись должна была попасть в
Код:
<ns:CallerSignature>

<!--You may enter ANY elements at this point-->


</ns:CallerSignature>


Код:

<?xml version="1.0"?>

-<Signature Id="Signature1-a8e34cf4c-9934-6270-6936-2c3a3a7a0d5" xmlns="http://www.w3.org/2000/09/xmldsig#">


-<SignedInfo>

<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>

<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/>


-<Reference URI="#Object1-a8e34cf4c-9934-6270-6936-2c3a3a7a0d5">


-<Transforms>

<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>

</Transforms>

<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>

<DigestValue>7ysDpLHI9zEbhlic5wNWlgGXgPheVuyUk092sS1Lh3U=</DigestValue>

</Reference>

</SignedInfo>

<SignatureValue>FAZ0vGPVlUhE6WAYG83uLIL4lMGEYKNDSGHxtHkWSPx7yvVKUKfykvDJGEMmtZ9X I71sUYKv2PUunReieZUEKw==</SignatureValue>


-<KeyInfo>


-<X509Data>

<X509Certificate>MIII/TCCCKqgAwIBAgIQWZChAJCtx65PKR5ey5PA9DAKBggqhQMHAQEDAjCCAVUx GjAYBgkqhkiG9w0BCQEWC3VjQG5hbG9nLnJ1MRgwFgYFKoUDZAESDTEwNDc3MDcw NkARINMTA0NzcwMjAyNjcwMTEaMBgGCCqFAwOBAwEBEgwwMDc3 MTA0NzQzNzUxLDAqBgNVBAMMI9Cc0LjQvdC60L7QvNGB0LLRj9C30Ywg0KDQvtGB 0YHQuNC4ggpn51LPAAAAAAOMMAoGCCqFAwcBAQMCA0EAS2kApkwU8ofe58R4q1lC kyKO0kZJjEgZrEh+vlBzItRRZPwwHJWcZuBhuCLM8KLVKwSO1bDfFf8876r1Nz0j Xw==</X509Certificate>

</X509Data>

</KeyInfo>


-<Object Id="Object1-a8e34cf4c-9934-6270-6936-2c3a3a7a0d5">


-<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0">

<soapenv:Header/>


-<soapenv:Body>


-<ns:SendGetBatchUINRequest>


-<ns:CallerSignature>

<!--You may enter ANY elements at this point-->


</ns:CallerSignature>


-<ns:RequestData id="data">

<ns:INP>1920032</ns:INP>

<ns:page>1</ns:page>

<ns:size>100</ns:size>

</ns:RequestData>

</ns:SendGetBatchUINRequest>

</soapenv:Body>

</soapenv:Envelope>

</Object>

</Signature>

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

Offline two_oceans  
#5 Оставлено : 8 апреля 2022 г. 11:09:40(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
Собственно, если в шаблоне подаваемом на подписание только один тег Signature с незаполненными значениями, то xPath можно не указывать. В одной из тем было чуть подробнее, базовый вариант xPath что-то вроде
Код:
"(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='Signature']]"
Это по сути то же самое что и не указывать - выбираются все теги Signature в документе и их содержимое. По вкусу добавить условие для выбора по атрибуту ID , как я понимаю примерно так.
Код:
"(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='Signature'][@ID='Signature1-a8e34cf4c-9934-6270-6936-2c3a3a7a0d5']]"


У Вас получилась enveloping подпись, а для такого расположения нужна скорее detached. Ее можно получить поставив SignatureType в CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE и передав шаблон в Content. Шаблон должен быть примерно такой с учетом расположения подписи и опустошения SignatureValue DigestValue:
Код:
<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0"><soapenv:Header/><soapenv:Body><ns:SendGetBatchUINRequest>
<ns:CallerSignature><Signature Id="Signature1-a8e34cf4c-9934-6270-6936-2c3a3a7a0d5" xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><Reference URI="#data"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><DigestValue></DigestValue></Reference></SignedInfo><SignatureValue></SignatureValue><KeyInfo><X509Data><X509Certificate>MIII/TCCCKqgAwIBAgIQWZChAJCtx65PKR5ey5PA9DAKBggqhQMHAQEDAjCCAVUx GjAYBgkqhkiG9w0BCQEWC3VjQG5hbG9nLnJ1MRgwFgYFKoUDZAESDTEwNDc3MDcw MzA1MTMxGjAYBggqhQMDgQMBARIMMDA3NzA3MzI5MTUyMQswCQYDVQQGEwJSVTEY MBYGA1UECAwPNzcg0JzQvtGB0LrQstCwMRkwFwYDVQQHDBDQsy4g0JzQvtGB0LrQ stCwMSkwJwYDVQQJDCDRg9C7LiDQndC10LPQu9C40L3QvdCw0Y8sINC0LiAyMzES MBAGA1UECwwJ0KPQpiDQrtCbMT8wPQYDVQQKDDbQpNC10LTQtdGA0LDQu9GM0L3Q sNGPINC90LDQu9C+0LPQvtCy0LDRjyDRgdC70YPQttCx0LAxPzA9BgNVBAMMNtCk 0LXQtNC10YDQsNC70YzQvdCw0Y8g0L3QsNC70L7Qs9C+0LLQsNGPINGB0LvRg9C2 0LHQsDAeFw0yMTA4MjYwOTM4MTVaFw0yMjExMjYwOTQ4MTVaMIIBsDEWMBQGBSqF A2QDEgswMDMxMjIzODM3MzEYMBYGBSqFA2QBEg0xMDMyMzIwMjQyMjUwMRowGAYI KoUDA4EDAQESDDAwMjMzNjAxNjA2MjELMAkGA1UEBhMCUlUxLzAtBgNVBAgMJjIz INCa0YDQsNGB0L3QvtC00LDRgNGB0LrQuNC5INC60YDQsNC5MS0wKwYDVQQHDCTQ odCi0JDQndCY0KbQkCwg0J/QntCb0KLQkNCS0KHQmtCQ0K8xOTA3BgNVBAkMMNCj 0JvQmNCm0JAg0JrQntCc0JzQo9Cd0JjQodCi0JjQp9CV0KHQmtCQ0K8sIDIxNjEs MCoGA1UECgwj0J7QntCeICIg0JjQnyDQotCV0KXQndCe0JvQntCT0JjQryIxLDAq BgNVBAMMI9Ce0J7QniAiINCY0J8g0KLQldCl0J3QntCb0J7Qk9CY0K8iMRkwFwYD VQQMDBDQlNC40YDQtdC60YLQvtGAMSgwJgYDVQQqDB/QmNCz0L7RgNGMINCd0LjQ utC+0LvQsNC10LLQuNGHMRcwFQYDVQQEDA7Qn9C+0LvRj9C60L7QsjBmMB8GCCqF AwcBAQEBMBMGByqFAwICJAAGCCqFAwcBAQICA0MABEDPD7behHPBdYoegXddt/q2 cPgY7VYl4RVaaMG0xu7DWnpEkLrg24/yOaV1bPhlVgOglD4YmlmTtB8AMnMhLpiU o4IE7jCCBOowDgYDVR0PAQH/BAQDAgTwMB0GA1UdDgQWBBTHpnPK9aqNBrAaGYik H6Q0nQsajjAqBgNVHSUEIzAhBggrBgEFBQcDAgYIKwYBBQUHAwQGCyqFAwICIiIB F5JCMIGLBggrBgEFBQcBAQR/MH0wPAYIKwYBBQUHMAKGMGh0dHA6Ly91Yy5uYWxv Zy5ydS9jcnQvY2FfZm5zX3J1c3NpYV8yMDE5X3VsLmNydDA9BggrBgEFBQcwAoYx aHR0cDovL2MwMDAwLWFwcDAwNS9jcnQvY2FfZm5zX3J1c3NpYV8yMDE5X3VsLmNy dDAdBgNVHSAEFjAUMAgGBiqFA2RxATAIBgYqhQNkcQIwKwYDVR0QBCQwIoAPMjAy MTA4MjYwOTM4MTRagQ8yMDIyMTEyNjA5MzgxNFowggEcBgUqhQNkcASCAREwggEN DDLQn9CQ0JrQnCAi0JrRgNC40L/RgtC+0J/RgNC+IEhTTSIg0LLQtdGA0YHQuNC4 IDIuMAwz0J/QkNCaICLQmtGA0LjQv9GC0L7Qn9GA0L4g0KPQpiIgKNCy0LXRgNGB 0LjQuCAyLjApDE/QodC10YDRgtC40YTQuNC60LDRgiDRgdC+0L7RgtCy0LXRgtGB 0YLQstC40Y8g4oSWINCh0KQvMTI0LTM0NzUg0L7RgiAxMC4wOC4yMDE4DFHQodC1 0YDRgtC40YTQuNC60LDRgiDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Y8g4oSWINCh 0KQvMTI4LTM1OTIg0L7RgiAxNy4xMC4gMjAxOCAwPwYFKoUDZG8ENgw00KHQmtCX 0JggItCa0YDQuNC/0YLQvtCf0YDQviBDU1AiICjQstC10YDRgdC40Y8gNC4wKTCB 7gYDVR0fBIHmMIHjMEmgR6BFhkNodHRwOi8vdWMubmFsb2cucnUvY2RwLzRlNWM1 NDNiNzBmZWZkNzRjNzU5NzMwNGYyY2FjYWQ3OTY3MDc4ZTQuY3JsMEqgSKBGhkRo dHRwOi8vYzAwMDAtYXBwMDA1L2NkcC80ZTVjNTQzYjcwZmVmZDc0Yzc1OTczMDRm MmNhY2FkNzk2NzA3OGU0LmNybDBKoEigRoZEaHR0cDovL2MwMDAwLWFwcDI2MS9j ZHAvNGU1YzU0M2I3MGZlZmQ3NGM3NTk3MzA0ZjJjYWNhZDc5NjcwNzhlNC5jcmww ggFfBgNVHSMEggFWMIIBUoAUTlxUO3D+/XTHWXME8srK15ZweOShggEspIIBKDCC ASQxHjAcBgkqhkiG9w0BCQEWD2RpdEBtaW5zdnlhei5ydTELMAkGA1UEBhMCUlUx GDAWBgNVBAgMDzc3INCc0L7RgdC60LLQsDEZMBcGA1UEBwwQ0LMuINCc0L7RgdC6 0LLQsDEuMCwGA1UECQwl0YPQu9C40YbQsCDQotCy0LXRgNGB0LrQsNGPLCDQtNC+ 0LwgNzEsMCoGA1UECgwj0JzQuNC90LrQvtC80YHQstGP0LfRjCDQoNC+0YHRgdC4 0LgxGDAWBgUqhQNkARINMTA0NzcwMjAyNjcwMTEaMBgGCCqFAwOBAwEBEgwwMDc3 MTA0NzQzNzUxLDAqBgNVBAMMI9Cc0LjQvdC60L7QvNGB0LLRj9C30Ywg0KDQvtGB 0YHQuNC4ggpn51LPAAAAAAOMMAoGCCqFAwcBAQMCA0EAS2kApkwU8ofe58R4q1lC kyKO0kZJjEgZrEh+vlBzItRRZPwwHJWcZuBhuCLM8KLVKwSO1bDfFf8876r1Nz0j Xw==</X509Certificate></X509Data></KeyInfo>
</Signature><!--You may enter ANY elements at this point--></ns:CallerSignature>
<ns:RequestData id="data"><ns:INP>1920032</ns:INP><ns:page>1</ns:page><ns:size>100</ns:size>/ns:RequestData>
</ns:SendGetBatchUINRequest></soapenv:Body></soapenv:Envelope>
Для упрощения всего процесса желательно чтобы внутри SignedInfo и внутри подписываемого фрагмента не было отступов перед тегами и переводов строк. Сохранив в файл с расширением xml и открыв в любом браузере будет виден документ в читаемом виде, даже если в самом файле нет отступов и переводов строк.

Отредактировано пользователем 8 апреля 2022 г. 11:29:04(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Infopol оставлено 08.04.2022(UTC)
Offline Infopol  
#6 Оставлено : 8 апреля 2022 г. 14:35:54(UTC)
Infopol

Статус: Активный участник

Группы: Участники
Зарегистрирован: 21.03.2022(UTC)
Сообщений: 33
Откуда: Краснодарский край

Сказал(а) «Спасибо»: 17 раз
Cформировал запрос с "чистыми значениями"
Код:
<soapenv:Envelope xmlns:soapenv="http:
schemas.xmlsoap.org/soap/envelope/"><soapenv:Header></soapenv:Header><soapenv:Body><ns:SendGetBatchUINRequest xmlns:ns="urn:
xsd.dmdk.goznak.ru/exchange/1.0"><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:CanonicalizationMethod><ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"></ds:SignatureMethod><ds:Reference URI="#body"><ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"></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></ns:CallerSignature><ns:RequestData id="body"><ns:INP>1920032</ns:INP><ns:page>1</ns:page><ns:size>100</ns:size></ns:RequestData></ns:SendGetBatchUINRequest></soapenv:Body></soapenv:Envelope>

Код в программе Инфо-Предприятие
Код:

         о=СОЗДАТЬ_ОБЪЕКТ!("Ip2Com_events.Ip2Com")


oSigner ЭТО ОБЪЕКТ
         oSignedXML ЭТО ОБЪЕКТ
        //   oSignedXML = о.iCreateComObject("CAdESCOM.SignedXML");
   
  oSigner =о.iCadesComSignerInicializire(SIGNER_OPTIONS,xCert)  
  oSigner.CheckCertificate = ДА 
    //    oSignedXML.Content = Text //dataToSign;
      //     oSignedXML ЭТО ОБЪЕКТ
           oSignedXML = о.iCreateComObject("CAdESCOM.SignedXML");
  
                               
 oSignedXML.SignatureType =2// CADESCOM_XML_SIGNATURE_TYPE_ENV;

             XmlDsigGost3410Url =SIGNATURE_ALGORITHM// "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411";
               XmlDsigGost3411Url =DIGEST_ALGORITHM// "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411";
  

        oSignedXML.SignatureMethod = XmlDsigGost3410Url;
        oSignedXML.DigestMethod = XmlDsigGost3411Url;


xPath="//*[local-name()='CallerSignature' and namespace-uri()='http://www.w3.org/2000/09/xmldsig#' and (count(*[local-name()='CallerSignature'])=0*[local-name()='CallerSignature']='')]]"
// xPath="//[(count(*[local-name()='CallerSignature'])=0]"// or *[local-name()='CallerSignature']='*')]]"
xPath="//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='*CallerSignature']]"[quote][/quote]                                           
//xPath="//*[local-name()='CallerSignature']"//"[local-name()='CallerSignature'"
                                           
//Texts=PrepareRequestDataXML(Text,ДА)//СТРОКА:xmlstr;ЛОГИКА:prep=НЕТ)
//  ["DLL"].ИНФОРМАЦИЯ(Text)              
                                           

   oSignedXML.Content = Text   
                                              
  sSignedMessage = oSignedXML.Sign(oSigner,xPath)


Xml.sol(98:6) Не удалось выполнить разбор запрошенных данных XML.
Думаю,что надо разбираться с параметром xPath

Отредактировано пользователем 8 апреля 2022 г. 14:43:12(UTC)  | Причина: Не указана

Offline two_oceans  
#7 Оставлено : 11 апреля 2022 г. 7:21:40(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
Автор: Infopol Перейти к цитате
oSignedXML.SignatureType =2// CADESCOM_XML_SIGNATURE_TYPE_ENV;
XmlDsigGost3410Url =SIGNATURE_ALGORITHM// "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411";
XmlDsigGost3411Url =DIGEST_ALGORITHM// "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411";
oSignedXML.SignatureMethod = XmlDsigGost3410Url;
oSignedXML.DigestMethod = XmlDsigGost3411Url;
...
sSignedMessage = oSignedXML.Sign(oSigner,xPath)
Этот кусочек кода подозрителен. Вроде же подписание по шаблону и гост-2012. Разве не три параметра Sign? В случая enveloped enveloping подписей xpath игнорируется (о чем в справке сказано), так как эти типы подписей жестко фиксированы по отношению к подписываемому фрагменту. Хотя возможно закомментированы не текущие значения, а старые - тогда вопросов нет.
Автор: Infopol Перейти к цитате
xPath="//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='*CallerSignature']]"
Xml.sol(98:6) Не удалось выполнить разбор запрошенных данных XML.
Думаю, что надо разбираться с параметром xPath
Не похоже на пример выше. Не вижу открывающей круглой скобки в начале. Зачем * перед CallerSignature? Там уже вызвана local-name() функция, убирающая префикс. Как интерпретировать строку в кавычках выбирается оператором сравнения "равно". Предположу, что после "равно" "*" означает только звездочку, а не любую последовательность символов. Тогда '*CallerSignature' не будет равно 'CallerSignature'. Вот и вся история - равенство не выполнено ни для одного узла, нечего выбрать. Как я понимаю суть выражения Xpath:
Код:
(//. | //@* | //namespace::*) - выбрать по типу текстовый узел или атрибут и тег любого пространства имен, если выполнено условие ниже
   [ancestor-or-self::* - любой узел, если в текущем узле или узле-предке выполняется условие ниже
     [local-name()='CallerSignature'] - имя тега без префикса равно 'CallerSignature'
   ]
Вообще неясно почему именно CallerSignature в фокусе, но это не должно повлиять, так как подпись внутри этого тега.
Offline Infopol  
#8 Оставлено : 11 апреля 2022 г. 8:42:13(UTC)
Infopol

Статус: Активный участник

Группы: Участники
Зарегистрирован: 21.03.2022(UTC)
Сообщений: 33
Откуда: Краснодарский край

Сказал(а) «Спасибо»: 17 раз
Цитата:
Этот кусочек кода подозрителен. Вроде же подписание по шаблону и гост-2012. Разве не три параметра Sign? В случая enveloped enveloping подписей xpath игнорируется (о чем в справке сказано), так как эти типы подписей жестко фиксированы по отношению к подписываемому фрагменту. Хотя возможно закомментированы не текущие значения, а старые - тогда вопросов нет.

А какой третий параметр?Вроде по TLB 2 параметра.
Вот как я делаю...
1.Этап считывание XML
Xml.sol(123/1190:8) Исходные данные
Код:

<soapenv:Envelope xmlns:soapenv="http:
schemas.xmlsoap.org/soap/envelope/"><soapenv:Header></soapenv:Header><soapenv:Body><ns:SendGetBatchRequest xmlns:ns="urn:
xsd.dmdk.goznak.ru/exchange/1.0"><ns:CallerSignature></ns:CallerSignature><ns:RequestData id="body"><ns:UIN_INP>1111111111111111</ns:UIN_INP></ns:RequestData></ns:SendGetBatchRequest></soapenv:Body></soapenv:Envelope>

2.Далее считываю два варианта для вычисления DigestValue
2.1 Body
Xml.sol(139/1206:8)
Код:
 <soapenv:Body xmlns:soapenv="http:
schemas.xmlsoap.org/soap/envelope/"><ns:SendGetBatchRequest xmlns:ns="urn:
xsd.dmdk.goznak.ru/exchange/1.0"><ns:CallerSignature></ns:CallerSignature><ns:RequestData id="body"><ns:UIN_INP>1111111111111111</ns:UIN_INP></ns:RequestData></ns:SendGetBatchRequest></soapenv:Body>

Получаем Hash
Xml.sol(141/1208:8) QjBGRkU4NTI2NkIyOUIxRUE5OTUwNkNDNDM0Mzc4MjNGNENDQ0RDMUQ3M0M3MTkwRkY4NkU4QTAwQ0VFOTQ5Nw==

2.2 RequestData

Xml.sol(144/1211:8)
Код:
 <ns:RequestData xmlns:soapenv="http:
schemas.xmlsoap.org/soap/envelope/" id="body"><ns:UIN_INP>1111111111111111</ns:UIN_INP></ns:RequestData>
Xml.sol(146/1213:8) MjE1QjEzRjc1QzJGQUE2QzFDNzk0NzdGNUMxQ0E5NDIxOTdDRURFMTRGNTIxOTc4QUQwQUFEQjIxNEVEMkEyNA==

3. Формирую секцию SignedInfo
По вашей рекомендации использую xэш от RequestData

Код:
<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:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>
<ds:DigestValue>MjE1QjEzRjc1QzJGQUE2QzFDNzk0NzdGNUMxQ0E5NDIxOTdDRURFMTRGNTIxOTc4QUQwQUFEQjIxNEVEMkEyNA==</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>

4. Подписываю именно эту секцию
SignedData=о.iCapicomSignedData();///СОЗДАТЬ_ОБЪЕКТ("Capicom.SignedData.1","capicom.dll");
SignedData.Content=SignInfo//["Crypto"].HashFunction(string,12)
signs=SignedData.Sign(iSigner,НЕТ,НЕТ);
5.Далее формирую секцию
hash-Hash от RequestData
X509Cert = xCert.Export(0)

SignatureSection=CreateSignatureSection(hash,sign,X509Cert,ДА)
SignatureSection=XML_SirCanocalizireString(SignatureSection)
Text= InsertSignature(Text,SignatureSection,"")
WriteXMLFromString(Text,файл+".signed.xml")
6. Вот
Код:

<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<ns:SendGetBatchRequest xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0">
<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:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>
<ds:DigestValue>MjE1QjEzRjc1QzJGQUE2QzFDNzk0NzdGNUMxQ0E5NDIxOTdDRURFMTRGNTIxOTc4QUQwQUFEQjIxNEVEMkEyNA==</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>MIIY1QYJKoZIhvcNAQcCoIIYxjCCGMICAQExDjAMBggqhQMHAQECAgUAMIID0QYJ KoZIhvcNAQcBoIIDwgSCA748AGQAcwA6AFMAaQBnAG4AZQBkAEkAbgBmAG8APgAK ADwAZABzADoAQwBhAG4AbwBuAGkAYwBhAGwAaQB6AGEAdABpAG8AbgBNAGUAdABo AG8AZAAgAEEAbABnAG8AcgBpAHQAaABtAD0AIgBoAHQAdABwADoALwAvAHcAdwB3 AC4AdwAzAC4AbwByAGcALwAyADAAMAAxAC8AMQAwAC8AeABtAGwALQBlAHgAYwAt AGMAMQA0AG4AIwAiAC8APgAKADwAZABzADoAUwBpAGcAbgBhAHQAdQByAGUATQBl AHQAaABvAGQAIABBAGwAZwBvAHIAaQB0AGgAbQA9ACIAdQByAG4AOgBpAGUAdABm ADoAcABhAHIAYQBtAHMAOgB4AG0AbAA6AG4AcwA6AGMAcAB4AG0AbABzAGUAYwA6 AGEAbABnAG8AcgBpAHQAaABtAHMAOgBnAG8AcwB0AHIAMwA0ADEAMAAyADAAMQAy AC0AZwBvAHMAdAByADMANAAxADEAMgAwADEAMgAtADIANQA2ACIALwA+AAoAPABk AHMAOgBSAGUAZgBlAHIAZQBuAGMAZQAgAFUAUgBJAD0AIgAjAGIAbwBkAHkAIgA+ AAoAPABkAHMAOgBEAGkAZwBlAHMAdABNAGUAdABoAG8AZAAgAEEAbABnAG8AcgBp AHQAaABtAD0AIgB1AHIAbgA6AGkAZQB0AGYAOgBwAGEAcgBhAG0AcwA6AHgAbQBs ADoAbgBzADoAYwBwAHgAbQBsAHMAZQBjADoAYQBsAGcAbwByAGkAdABoAG0AcwA6 AGcAbwBzAHQAcgAzADQAMQAxADIAMAAxADIALQAyADUANgAiAC8APgAKADwAZABz ADoARABpAGcAZQBzAHQAVgBhAGwAdQBlAD4ATQBqAEUAMQBRAGoARQB6AFIAagBj ADEAUQB6AEoARwBRAFUARQAyAFEAegBGAEQATgB6AGsAMABOAHoAZABHAE4AVQBN AHgAUQAwAEUANQBOAEQASQB4AE8AVABkAEQAUgBVAFIARgBNAFQAUgBHAE4AVABJ AHgATwBUAGMANABRAFUAUQB3AFEAVQBGAEUAUQBqAEkAeABOAEUAVgBFAE0AawBF AHkATgBBAD0APQA8AC8AZABzADoARABpAGcAZQBzAHQAVgBhAGwAdQBlAD4ACgA8 AC8AZABzADoAUgBlAGYAZQByAGUAbgBjAGUAPgAKADwALwBkAHMAOgBTAGkAZwBu AGUAZABJAG4AZgBvAD4AoIIQyzCCB8YwggdzoAMCAQICCmfnUs8AAAAAA4wwCgYI KoUDBwEBAwIwggEkMR4wHAYJKoZIhvcNAQkBFg9kaXRAbWluc3Z5YXoucnUxCzAJ BgNVBAYTAlJVMRgwFgYDVQQIDA83NyDQnNC+0YHQutCy0LAxGTAXBgNVBAcMENCz LiDQnNC+0YHQutCy0LAxLjAsBgNVBAkMJdGD0LvQuNGG0LAg0KLQstC10YDRgdC6 0LDRjywg0LTQvtC8IDcxLDAqBgNVBAoMI9Cc0LjQvdC60L7QvNGB0LLRj9C30Ywg 0KDQvtGB0YHQuNC4MRgwFgYFKoUDZAESDTEwNDc3MDIwMjY3MDExGjAYBggqhQMD gQMBARIMMDA3NzEwNDc0Mzc1MSwwKgYDVQQDDCPQnNC40L3QutC+0LzRgdCy0Y/Q t9GMINCg0L7RgdGB0LjQuDAeFw0xOTEyMjYxMTAwMzhaFw0zNDEyMjYxMTAwMzha MIIBVTEaMBgGCSqGSIb3DQEJARYLdWNAbmFsb2cucnUxGDAWBgUqhQNkARINMTA0 NzcwNzAzMDUxMzEaMBgGCCqFAwOBAwEBEgwwMDc3MDczMjkxNTIxCzAJBgNVBAYT AlJVMRgwFgYDVQQIDA83NyDQnNC+0YHQutCy0LAxGTAXBgNVBAcMENCzLiDQnNC+ 0YHQutCy0LAxKTAnBgNVBAkMINGD0LsuINCd0LXQs9C70LjQvdC90LDRjywg0LQu IDIzMRIwEAYDVQQLDAnQo9CmINCu0JsxPzA9BgNVBAoMNtCk0LXQtNC10YDQsNC7 0YzQvdCw0Y8g0L3QsNC70L7Qs9C+0LLQsNGPINGB0LvRg9C20LHQsDE/MD0GA1UE Aww20KTQtdC00LXRgNCw0LvRjNC90LDRjyDQvdCw0LvQvtCz0L7QstCw0Y8g0YHQ u9GD0LbQsdCwMGYwHwYIKoUDBwEBAQEwEwYHKoUDAgIjAQYIKoUDBwEBAgIDQwAE QGeDrPjapq5nUIpl4Ry4fzh6A4qBVB/prE+5dGmZe0ai83ByGT8r+1e0cI3M8fER acxME/ji2OIBykuxVou3Q4OjggRJMIIERTALBgNVHQ8EBAMCAYYwHQYDVR0OBBYE FE5cVDtw/v10x1lzBPLKyteWcHjkMBIGA1UdEwEB/wQIMAYBAf8CAQAwJQYDVR0g BB4wHDAIBgYqhQNkcQEwCAYGKoUDZHECMAYGBFUdIAAwcwYFKoUDZG8Eagxo0J/Q kNCa0JwgItCa0YDQuNC/0YLQvtCf0YDQviBIU00iINCy0LXRgNGB0LjQuCAyLjAg KNC60L7QvNC/0LvQtdC60YLQsNGG0LjRjyAxKSAo0LjRgdC/0L7Qu9C90LXQvdC4 0LUgMSkwFAYJKwYBBAGCNxQCBAcMBVN1YkNBMBAGCSsGAQQBgjcVAQQDAgEAMIIB ZQYDVR0jBIIBXDCCAViAFMJU8bRr1Ey34G02tCOQ8f7DPJsGoYIBLKSCASgwggEk MR4wHAYJKoZIhvcNAQkBFg9kaXRAbWluc3Z5YXoucnUxCzAJBgNVBAYTAlJVMRgw FgYDVQQIDA83NyDQnNC+0YHQutCy0LAxGTAXBgNVBAcMENCzLiDQnNC+0YHQutCy 0LAxLjAsBgNVBAkMJdGD0LvQuNGG0LAg0KLQstC10YDRgdC60LDRjywg0LTQvtC8 IDcxLDAqBgNVBAoMI9Cc0LjQvdC60L7QvNGB0LLRj9C30Ywg0KDQvtGB0YHQuNC4 MRgwFgYFKoUDZAESDTEwNDc3MDIwMjY3MDExGjAYBggqhQMDgQMBARIMMDA3NzEw NDc0Mzc1MSwwKgYDVQQDDCPQnNC40L3QutC+0LzRgdCy0Y/Qt9GMINCg0L7RgdGB 0LjQuIIQTm1HiybyfWV/do4CXOPTkzCBmAYDVR0fBIGQMIGNMC2gK6AphidodHRw Oi8vcmVlc3RyLXBraS5ydS9jZHAvZ3VjX2dvc3QxMi5jcmwwLaAroCmGJ2h0dHA6 Ly9jb21wYW55LnJ0LnJ1L2NkcC9ndWNfZ29zdDEyLmNybDAtoCugKYYnaHR0cDov L3Jvc3RlbGVjb20ucnUvY2RwL2d1Y19nb3N0MTIuY3JsMEMGCCsGAQUFBwEBBDcw NTAzBggrBgEFBQcwAoYnaHR0cDovL3JlZXN0ci1wa2kucnUvY2RwL2d1Y19nb3N0 MTIuY3J0MIH1BgUqhQNkcASB6zCB6Aw00J/QkNCa0JwgwqvQmtGA0LjQv9GC0L7Q n9GA0L4gSFNNwrsg0LLQtdGA0YHQuNC4IDIuMAxD0J/QkNCaIMKr0JPQvtC70L7Q stC90L7QuSDRg9C00L7RgdGC0L7QstC10YDRj9GO0YnQuNC5INGG0LXQvdGC0YDC uww10JfQsNC60LvRjtGH0LXQvdC40LUg4oSWIDE0OS8zLzIvMi8yMyDQvtGCIDAy LjAzLjIwMTgMNNCX0LDQutC70Y7Rh9C10L3QuNC1IOKEliAxNDkvNy82LzEwNSDQ vtGCIDI3LjA2LjIwMTgwCgYIKoUDBwEBAwIDQQBXyr30VQIDLIVjINuF/CO50R9+ seFNbRyPsUFPefaPs4EpHhI5ASE9mqNiuDYzoD+X7uWEXvAv3rS0LNy0J0uOMIII /TCCCKqgAwIBAgIQWZChAJCtx65PKR5ey5PA9DAKBggqhQMHAQEDAjCCAVUxGjAY BgkqhkiG9w0BCQEWC3VjQG5hbG9nLnJ1MRgwFgYFKoUDZAESDTEwNDc3MDcwMzA1 MTMxGjAYBggqhQMDgQMBARIMMDA3NzA3MzI5MTUyMQswCQYDVQQGEwJSVTEYMBYG A1UECAwPNzcg0JzQvtGB0LrQstCwMRkwFwYDVQQHDBDQsy4g0JzQvtGB0LrQstCw MSkwJwYDVQQJDCDRg9C7LiDQndC10LPQu9C40L3QvdCw0Y8sINC0LiAyMzESMBAG A1UECwwJ0KPQpiDQrtCbMT8wPQYDVQQKDDbQpNC10LTQtdGA0LDQu9GM0L3QsNGP INC90LDQu9C+0LPQvtCy0LDRjyDRgdC70YPQttCx0LAxPzA9BgNVBAMMNtCk0LXQ tNC10YDQsNC70YzQvdCw0Y8g0L3QsNC70L7Qs9C+0LLQsNGPINGB0LvRg9C20LHQ sDAeFw0yMTA4MjYwOTM4MTVaFw0yMjExMjYwOTQ4MTVaMIIBsDEWMBQGBSqFA2QD EgswMDMxMjIzODM3MzEYMBYGBSqFA2QBEg0xMDMyMzIwMjQyMjUwMRowGAYIKoUD A4EDAQESDDAwMjMzNjAxNjA2MjELMAkGA1UEBhMCUlUxLzAtBgNVBAgMJjIzINCa 0YDQsNGB0L3QvtC00LDRgNGB0LrQuNC5INC60YDQsNC5MS0wKwYDVQQHDCTQodCi 0JDQndCY0KbQkCwg0J/QntCb0KLQkNCS0KHQmtCQ0K8xOTA3BgNVBAkMMNCj0JvQ mNCm0JAg0JrQntCc0JzQo9Cd0JjQodCi0JjQp9CV0KHQmtCQ0K8sIDIxNjEsMCoG A1UECgwj0J7QntCeICIg0JjQnyDQotCV0KXQndCe0JvQntCT0JjQryIxLDAqBgNV BAMMI9Ce0J7QniAiINCY0J8g0KLQldCl0J3QntCb0J7Qk9CY0K8iMRkwFwYDVQQM DBDQlNC40YDQtdC60YLQvtGAMSgwJgYDVQQqDB/QmNCz0L7RgNGMINCd0LjQutC+ 0LvQsNC10LLQuNGHMRcwFQYDVQQEDA7Qn9C+0LvRj9C60L7QsjBmMB8GCCqFAwcB AQEBMBMGByqFAwICJAAGCCqFAwcBAQICA0MABEDPD7behHPBdYoegXddt/q2cPgY 7VYl4RVaaMG0xu7DWnpEkLrg24/yOaV1bPhlVgOglD4YmlmTtB8AMnMhLpiUo4IE 7jCCBOowDgYDVR0PAQH/BAQDAgTwMB0GA1UdDgQWBBTHpnPK9aqNBrAaGYikH6Q0 nQsajjAqBgNVHSUEIzAhBggrBgEFBQcDAgYIKwYBBQUHAwQGCyqFAwICIiIBF5JC MIGLBggrBgEFBQcBAQR/MH0wPAYIKwYBBQUHMAKGMGh0dHA6Ly91Yy5uYWxvZy5y dS9jcnQvY2FfZm5zX3J1c3NpYV8yMDE5X3VsLmNydDA9BggrBgEFBQcwAoYxaHR0 cDovL2MwMDAwLWFwcDAwNS9jcnQvY2FfZm5zX3J1c3NpYV8yMDE5X3VsLmNydDAd BgNVHSAEFjAUMAgGBiqFA2RxATAIBgYqhQNkcQIwKwYDVR0QBCQwIoAPMjAyMTA4 MjYwOTM4MTRagQ8yMDIyMTEyNjA5MzgxNFowggEcBgUqhQNkcASCAREwggENDDLQ n9CQ0JrQnCAi0JrRgNC40L/RgtC+0J/RgNC+IEhTTSIg0LLQtdGA0YHQuNC4IDIu MAwz0J/QkNCaICLQmtGA0LjQv9GC0L7Qn9GA0L4g0KPQpiIgKNCy0LXRgNGB0LjQ uCAyLjApDE/QodC10YDRgtC40YTQuNC60LDRgiDRgdC+0L7RgtCy0LXRgtGB0YLQ stC40Y8g4oSWINCh0KQvMTI0LTM0NzUg0L7RgiAxMC4wOC4yMDE4DFHQodC10YDR gtC40YTQuNC60LDRgiDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Y8g4oSWINCh0KQv MTI4LTM1OTIg0L7RgiAxNy4xMC4gMjAxOCAwPwYFKoUDZG8ENgw00KHQmtCX0Jgg ItCa0YDQuNC/0YLQvtCf0YDQviBDU1AiICjQstC10YDRgdC40Y8gNC4wKTCB7gYD VR0fBIHmMIHjMEmgR6BFhkNodHRwOi8vdWMubmFsb2cucnUvY2RwLzRlNWM1NDNi NzBmZWZkNzRjNzU5NzMwNGYyY2FjYWQ3OTY3MDc4ZTQuY3JsMEqgSKBGhkRodHRw Oi8vYzAwMDAtYXBwMDA1L2NkcC80ZTVjNTQzYjcwZmVmZDc0Yzc1OTczMDRmMmNh Y2FkNzk2NzA3OGU0LmNybDBKoEigRoZEaHR0cDovL2MwMDAwLWFwcDI2MS9jZHAv NGU1YzU0M2I3MGZlZmQ3NGM3NTk3MzA0ZjJjYWNhZDc5NjcwNzhlNC5jcmwwggFf BgNVHSMEggFWMIIBUoAUTlxUO3D+/XTHWXME8srK15ZweOShggEspIIBKDCCASQx HjAcBgkqhkiG9w0BCQEWD2RpdEBtaW5zdnlhei5ydTELMAkGA1UEBhMCUlUxGDAW BgNVBAgMDzc3INCc0L7RgdC60LLQsDEZMBcGA1UEBwwQ0LMuINCc0L7RgdC60LLQ sDEuMCwGA1UECQwl0YPQu9C40YbQsCDQotCy0LXRgNGB0LrQsNGPLCDQtNC+0Lwg NzEsMCoGA1UECgwj0JzQuNC90LrQvtC80YHQstGP0LfRjCDQoNC+0YHRgdC40Lgx GDAWBgUqhQNkARINMTA0NzcwMjAyNjcwMTEaMBgGCCqFAwOBAwEBEgwwMDc3MTA0 NzQzNzUxLDAqBgNVBAMMI9Cc0LjQvdC60L7QvNGB0LLRj9C30Ywg0KDQvtGB0YHQ uNC4ggpn51LPAAAAAAOMMAoGCCqFAwcBAQMCA0EAS2kApkwU8ofe58R4q1lCkyKO 0kZJjEgZrEh+vlBzItRRZPwwHJWcZuBhuCLM8KLVKwSO1bDfFf8876r1Nz0jXzGC BAcwggQDAgEBMIIBazCCAVUxGjAYBgkqhkiG9w0BCQEWC3VjQG5hbG9nLnJ1MRgw FgYFKoUDZAESDTEwNDc3MDcwMzA1MTMxGjAYBggqhQMDgQMBARIMMDA3NzA3MzI5 MTUyMQswCQYDVQQGEwJSVTEYMBYGA1UECAwPNzcg0JzQvtGB0LrQstCwMRkwFwYD VQQHDBDQsy4g0JzQvtGB0LrQstCwMSkwJwYDVQQJDCDRg9C7LiDQndC10LPQu9C4 0L3QvdCw0Y8sINC0LiAyMzESMBAGA1UECwwJ0KPQpiDQrtCbMT8wPQYDVQQKDDbQ pNC10LTQtdGA0LDQu9GM0L3QsNGPINC90LDQu9C+0LPQvtCy0LDRjyDRgdC70YPQ ttCx0LAxPzA9BgNVBAMMNtCk0LXQtNC10YDQsNC70YzQvdCw0Y8g0L3QsNC70L7Q s9C+0LLQsNGPINGB0LvRg9C20LHQsAIQWZChAJCtx65PKR5ey5PA9DAMBggqhQMH AQECAgUAoIICLzAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJ BTEPFw0yMjA0MTEwNTQwMDNaMC8GCSqGSIb3DQEJBDEiBCDRNUFdhGb3hHBnv6A4 vdE3Y+KNsdUyFGn3h3Dob74EcjCCAcIGCyqGSIb3DQEJEAIvMYIBsTCCAa0wggGp MIIBpTAKBggqhQMHAQECAgQgSv3Ppm9xhoeTvKreNuLfrhxcC8zaDffJzyZQbrou rD0wggFzMIIBXaSCAVkwggFVMRowGAYJKoZIhvcNAQkBFgt1Y0BuYWxvZy5ydTEY MBYGBSqFA2QBEg0xMDQ3NzA3MDMwNTEzMRowGAYIKoUDA4EDAQESDDAwNzcwNzMy OTE1MjELMAkGA1UEBhMCUlUxGDAWBgNVBAgMDzc3INCc0L7RgdC60LLQsDEZMBcG A1UEBwwQ0LMuINCc0L7RgdC60LLQsDEpMCcGA1UECQwg0YPQuy4g0J3QtdCz0LvQ uNC90L3QsNGPLCDQtC4gMjMxEjAQBgNVBAsMCdCj0KYg0K7QmzE/MD0GA1UECgw2 0KTQtdC00LXRgNCw0LvRjNC90LDRjyDQvdCw0LvQvtCz0L7QstCw0Y8g0YHQu9GD 0LbQsdCwMT8wPQYDVQQDDDbQpNC10LTQtdGA0LDQu9GM0L3QsNGPINC90LDQu9C+ 0LPQvtCy0LDRjyDRgdC70YPQttCx0LACEFmQoQCQrceuTykeXsuTwPQwDAYIKoUD BwEBAQEFAARAjSfE54EFQZaTxRn/SeB/7GulkTtHDCj545qcA38z+VJX664+pbuJ iI5+vLBBZNamiBos0D0QK3nw2QF3gU7kvg== </ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIII/TCCCKqgAwIBAgIQWZChAJCtx65PKR5ey5PA9DAKBggqhQMHAQEDAjCCAVUx GjAYBgkqhkiG9w0BCQEWC3VjQG5hbG9nLnJ1MRgwFgYFKoUDZAESDTEwNDc3MDcw 
....
....
....
....
0YHQuNC4ggpn51LPAAAAAAOMMAoGCCqFAwcBAQMCA0EAS2kApkwU8ofe58R4q1lC kyKO0kZJjEgZrEh+vlBzItRRZPwwHJWcZuBhuCLM8KLVKwSO1bDfFf8876r1Nz0j Xw== </ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</ns:CallerSignature>
<ns:RequestData id="body">
<ns:UIN_INP>1111111111111111</ns:UIN_INP>
</ns:RequestData>
</ns:SendGetBatchRequest>
</soapenv:Body>
</soapenv:Envelope>

ds:SignatureValue> очень длинный,может нужен Hash от этой строки?

Отредактировано пользователем 11 апреля 2022 г. 12:27:52(UTC)  | Причина: Не указана

Offline two_oceans  
#9 Оставлено : 11 апреля 2022 г. 13:07:38(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
Автор: Infopol Перейти к цитате
А какой третий параметр?Вроде по TLB 2 параметра.
Похоже про разное говорим.
Автор: Infopol Перейти к цитате
Вот как я делаю... 1.Этап считывание XML
А по 2 наклонные черты в значениях xmlns где потерялись?
Автор: Infopol Перейти к цитате
2.Далее считываю два варианта для вычисления DigestValue
2.1 Body
Нет 2 наклонных черт, лишний пробел в начале, приведенный хэш длиной ~90 символов base64 - это слишком много для гост-2012 256 бит, надо в 2 раза короче. Сравните:
Код:
<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><ns:SendGetBatchRequest xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0"><ns:CallerSignature></ns:CallerSignature><ns:RequestData id="body"><ns:UIN_INP>1111111111111111</ns:UIN_INP></ns:RequestData></ns:SendGetBatchRequest></soapenv:Body>
6ACD785A651B72715837AB1B554BCDB9472F83D90A134FED858E4891B7D689AB
as14WmUbcnFYN6sbVUvNuUcvg9kKE0/thY5IkbfWias=
FLIP RESULT:
AB89D6B791488E85ED4F130AD9832F47B9CD4B551BAB375871721B655A78CD6A
q4nWt5FIjoXtTxMK2YMvR7nNS1UbqzdYcXIbZVp4zWo=
Автор: Infopol Перейти к цитате
2.2 RequestData
Не то пространство имен, нет 2 наклонных черт, слишком длинный хэш. Сравните:
Код:
<ns:RequestData xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0" id="body"><ns:UIN_INP>1111111111111111</ns:UIN_INP></ns:RequestData>
DDB6B484B1FB54113EDF0B73A0E7742CC645E6FF2B628A138654DFF18F90464B
3ba0hLH7VBE+3wtzoOd0LMZF5v8rYooThlTf8Y+QRks=
FLIP RESULT:
4B46908FF1DF5486138A622BFFE645C62C74E7A0730BDF3E1154FBB184B4B6DD
S0aQj/HfVIYTimIr/+ZFxix056BzC98+EVT7sYS0tt0=
Автор: Infopol Перейти к цитате
3. Формирую секцию SignedInfo
По вашей рекомендации использую xэш от RequestData
желательно без переводов строк, нет трансформов? Если делали приведение к каноничному виду (или подпись будет вложена в подписанный фрагмент) трансформ обязательно надо указывать.

Слишком длинный хэш, нет 2 наклонных черт, нет xmlns:ds="...". Нюанс в том, что ds:CanonicalizationMethod Algorithm применяется к содержимому 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: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>
</ds:Transforms>
<ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>
<ds:DigestValue>3ba0hLH7VBE+3wtzoOd0LMZF5v8rYooThlTf8Y+QRks=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>

Автор: Infopol Перейти к цитате
4. Подписываю именно эту секцию ... ds:SignatureValue очень длинный, может нужен Hash от этой строки?
На этом месте стоп, совсем не в ту сторону - в SignatureValue указывается "голое"/"чистое"/RAW значение подписи, для гост оно должно быть длиной в 2 раза больше чем хэш, то есть для гост-2012 256 = 84-90 символов base64. 90 если с переводом строки, 88 без перевода строки (84-86 крайне редкий случай). SignedData формирует полноценную подпись cades, вырезать оттуда нужное "чистое" значение проблематично (место может сдвигаться, для точного места надо все раскодировать) и не всегда возможно (в продвинутых форматах cades подписывается не сам текст). Для таких случаев есть отдельный объект RawSignature, дающий "чистое" значение и нужную длину. Подробнее:
4.1 создать HashedData, RawSignature, Signer
4.2 указать HashedData.Encoding= base64
4.3 закодировать SignedInfo в base64 (без 4.2-4.3 связка передача в плагин может портить данные, перестраховка)
4.4 загрузить кодированную SignedInfo в объект HashedData.Content (собственно если после пунктов 4.1-4.4 получить значение хэша, так можно считать хэш для 2.1, 2.2)
4.5 потом передать объект HashedData в RawSignature.SignHash (еще там насколько помню нужен Signer с указанным сертификатом)
4.6 полученное из SignHash значение скорее всего нужно перевернуть (первый байт с последним, второй с предпоследним и т.д.)
4.7 закодировать в Base64
4.8 вставить в SignatureValue

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Infopol оставлено 11.04.2022(UTC)
Offline Infopol  
#10 Оставлено : 11 апреля 2022 г. 16:11:30(UTC)
Infopol

Статус: Активный участник

Группы: Участники
Зарегистрирован: 21.03.2022(UTC)
Сообщений: 33
Откуда: Краснодарский край

Сказал(а) «Спасибо»: 17 раз
Цитата:
На этом месте стоп, совсем не в ту сторону - в SignatureValue указывается "голое"/"чистое"/RAW значение подписи, для гост оно должно быть длиной в 2 раза больше чем хэш, то есть для гост-2012 256 = 84-90 символов base64. 90 если с переводом строки, 88 без перевода строки (84-86 крайне редкий случай). SignedData формирует полноценную подпись cades, вырезать оттуда нужное "чистое" значение проблематично (место может сдвигаться, для точного места надо все раскодировать) и не всегда возможно (в продвинутых форматах cades подписывается не сам текст). Для таких случаев есть отдельный объект RawSignature, дающий "чистое" значение и нужную длину. Подробнее:
4.1 создать HashedData, RawSignature, Signer
4.2 указать HashedData.Encoding= base64
4.3 закодировать SignedInfo в base64 (без 4.2-4.3 связка передача в плагин может портить данные, перестраховка)
4.4 загрузить кодированную SignedInfo в объект HashedData.Content (собственно если после пунктов 4.1-4.4 получить значение хэша, так можно считать хэш для 2.1, 2.2)
4.5 потом передать объект HashedData в RawSignature.SignHash (еще там насколько помню нужен Signer с указанным сертификатом)
4.6 полученное из SignHash значение скорее всего нужно перевернуть (первый байт с последним, второй с предпоследним и т.д.)
4.7 закодировать в Base64
4.8 вставить в SignatureValue

Привел SignedData к нужному виду
Код:

<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:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"></ds:DigestMethod><ds:DigestValue>MjE1QjEzRjc1QzJGQUE2QzFDNzk0NzdGNUMxQ0E5NDIxOTdDRURFMTRGNTIxOTc4QUQwQUFEQjIxNEVEMkEyNA==</ds:DigestValue></ds:Reference></ds:SignedInfo>

Далее в программе
Цитата:

RAW=СОЗДАТЬ_ОБЪЕКТ("Cadescom.Rawsignature")
HashData=СОЗДАТЬ_ОБЪЕКТ("Cadescom.HashedData")
CADESCOM_CONTENT_ENCODING_TYPE=0 //DBASE64
HashData.Algorithm= CADESCOM_HASH_ALGORITHM(CADESCOM_HASH_METOD) //101
HashData.DataEncoding= CADESCOM_CONTENT_ENCODING_TYPE
hashSignInfo=( CadesComHash(SignInfo,CADESCOM_HASH_METOD))
HashData.Hash(EnCode64Str(SignInfo))
// СТОП
rawstr=( RAW.SignHash( HashData,xCert))
ob= RAW.VerifyHash(HashData,xCert,rawstr)

ОТЛАДКА(HashData.Value,EnCode64Str(HashData.Value))
Xml.sol(239/1310:9) 6E166A15ACAC3E6FDD22DDA97CD028BE8F5EF3F1B16E406DD5B85E63927C5210, NkUxNjZBMTVBQ0FDM0U2RkREMjJEREE5N0NEMDI4QkU4RjVFRjNGMUIxNkU0MDZERDVCODVFNjM5MjdDNTIxMA==
ОТЛАДКА( ДЛИНА(rawstr),rawstr ) // Длина 128
Xml.sol(240/1311:10) 128, 7119BFFAE59969E6C86C42052CEB2A002918EB3FA28790F7C12F8064131CDFA4D97F7C9F9835681522E499E04D8E44587FA991CAE390623C0E11023839D4BC61
Xml.sol(243/1314:11)
rawstr=EnCode64Str(rawstr)
ОТЛАДКА(rawstr)
/// Результат RAW.SignHash в BASE64 в перевернутом видел для GOST
NzExOUJGRkFFNTk5NjlFNkM4NkM0MjA1MkNFQjJBMDAyOTE4RUIzRkEyODc5MEY3QzEyRjgwNjQxMzFDREZBNEQ5N0Y3QzlGOTgzNTY4MTUyMkU0OTlFMDREOEU0NDU4N0ZBOTkxQ0FFMzkwNjIzQzBFMTEwMjM4MzlENEJDNjE=

SignatureSection=CreateSignatureSection(hash,УБР_ПРОБ( rawstr),X509Cert,ДА)
SignatureSection=XML_SirCanocalizireString(SignatureSection)
Text= InsertSignature(Text,SignatureSection,"")
WriteXMLFromString(Text,файл+".signed.xml")
//ОТЛАДКА(cSignedData.Verify(SignatureSection,CADESCOM_CADES_TYPE, bDetached))

// ОТЛАДКА( о.iCadesComVerifyXML(Text) )
file=файл+".signed.xml"
ВЫПОЛНИТЬ(file)
ОТЛАДКА(XMLVerifyGostSigned(file))
Xml.sol(254/1325:12) НЕТ

Сделал все как вы рекомендовали...верификация файла - НЕТ
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.