Atom Лента - Форум КриптоПро - Тема:СМЭВ 3.x - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:SMEhV3.x-10:1Copyright 2024 Форум КриптоПро2024-03-19T13:47:07Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruInfopolhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=62020&name=InfopolInfopolhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=62020&name=InfopolDanilaKhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=61611&name=DanilaKtwo_oceanshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=36490&name=two_oceansDanilaKhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=61611&name=DanilaKrafaelkhasanovhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=59306&name=rafaelkhasanovtwo_oceanshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=36490&name=two_oceanstwo_oceanshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=36490&name=two_oceansvyacheslav123456789https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=58315&name=vyacheslav123456789two_oceanshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=36490&name=two_oceansСоня Базуроваhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=35821&name=Соня БазуроваYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid139400:1СМЭВ 3.x<table class="content postContainer_Alt" width="100%"><tr><td>Вот нашел по СМЭВ правда в php<br /><a rel="nofollow" href="https://github.com/Danbka/smev-transform" title="https://github.com/Danbka/smev-transform">https://github.com/Danbka/smev-transform</a><br />Но может кто нарисует DLL в Delphi или CBuilder,C++ было бы отлично. <br />Примерно TransformSMEV(str:string):String </td></tr></table>2023-03-07T19:44:36+03:002023-03-07T19:44:36+03:00Infopol<table class="content postContainer_Alt" width="100%"><tr><td>Вот нашел по СМЭВ правда в php<br /><a rel="nofollow" href="https://github.com/Danbka/smev-transform" title="https://github.com/Danbka/smev-transform">https://github.com/Danbka/smev-transform</a><br />Но может кто нарисует DLL в Delphi или CBuilder,C++ было бы отлично. <br />Примерно TransformSMEV(str:string):String </td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid133099:1СМЭВ 3.x<table class="content postContainer" width="100%"><tr><td>Спасибо! <br /><br />Значение хеша от каноникализированного SignedInfo и длина данных (у меня было 742) для подписи помогли найти '\n' на конце base64 значения хеша (DigestValue). <br />После удаления перевода строки хеш сошелся, а подпись прошла проверку на портале СМЭВ.<br /><br />Благодарю за подробный ответ и ценные комментарии по коду!</td></tr></table>2022-05-11T11:27:30+03:002022-05-11T11:27:30+03:00DanilaK<table class="content postContainer" width="100%"><tr><td>Спасибо! <br /><br />Значение хеша от каноникализированного SignedInfo и длина данных (у меня было 742) для подписи помогли найти '\n' на конце base64 значения хеша (DigestValue). <br />После удаления перевода строки хеш сошелся, а подпись прошла проверку на портале СМЭВ.<br /><br />Благодарю за подробный ответ и ценные комментарии по коду!</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid132973:1СМЭВ 3.xСуть проверки в том, что значение подписи делиться на случайно выбранное число и проверочное значение, после операций с их участием (плюс открытого ключа и значения хэша) должно снова получиться проверочное значение. Не получилось - выдается "Неправильная ЭП" (неправильная математически). Причина может быть в любом из участвующих значений (не тот хэш, не тот ключ, не то проверочное число, перевернуто значение подписи). Из-за разного случайного значения значение подписи будет разное (если использовать КриптоПро или другие сертифицированные СКЗИ). Своя же реализация подписания гост-2012, естественно может "чисто случайно" выбирать одинаковое "случайное" значение.<br /><br />Если нет желания светить "боевой" сертификат на форуме, для тестов пойдет и тестовый сертификат. Или можно прикрепить только открытый ключ из сертификата (СМЭВ это не примет из-за более тонкой проверки сертификата, но вообще стандартом допустимо указание открытого ключа вместо сертификата и есть давний черновик RFC с учетом специфики гост).<br /><br />Фрагменты лучше оформлять кнопочкой над сообщением "Выберите тип подсветки кода" - Plain Text, без этого форум их может исказить. В идеале - сохранить фрагменты в отдельные txt файлы и прикрепить архивом.<br /><br />По исходному коду вроде бы не вижу ничего критичного, для AT_KEYEXCHANGE должно работать. Получения значения хэша, к слову, там нет. Мысли по улучшению после отладки:[SPOILER]<div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">if (!pKeyInfo->dwKeySpec == AT_KEYEXCHANGE) {
LogLastError("NOT AT_KEYEXCHANGE");
return false;
}
...
DWORD cbSignature;
if (!CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, 0, NULL, &cbSignature)) {
LogLastError("Error CryptSignHash");
return false;
}
BYTE* pbSignature = new BYTE[cbSignature];
if (!CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, 0, pbSignature, &cbSignature)) {
LogLastError("Error CryptSignHash");
return false;
}</code></pre>
</div></div>2022-04-30T00:57:28+03:002022-04-30T00:57:28+03:00two_oceansСуть проверки в том, что значение подписи делиться на случайно выбранное число и проверочное значение, после операций с их участием (плюс открытого ключа и значения хэша) должно снова получиться проверочное значение. Не получилось - выдается "Неправильная ЭП" (неправильная математически). Причина может быть в любом из участвующих значений (не тот хэш, не тот ключ, не то проверочное число, перевернуто значение подписи). Из-за разного случайного значения значение подписи будет разное (если использовать КриптоПро или другие сертифицированные СКЗИ). Своя же реализация подписания гост-2012, естественно может "чисто случайно" выбирать одинаковое "случайное" значение.<br /><br />Если нет желания светить "боевой" сертификат на форуме, для тестов пойдет и тестовый сертификат. Или можно прикрепить только открытый ключ из сертификата (СМЭВ это не примет из-за более тонкой проверки сертификата, но вообще стандартом допустимо указание открытого ключа вместо сертификата и есть давний черновик RFC с учетом специфики гост).<br /><br />Фрагменты лучше оформлять кнопочкой над сообщением "Выберите тип подсветки кода" - Plain Text, без этого форум их может исказить. В идеале - сохранить фрагменты в отдельные txt файлы и прикрепить архивом.<br /><br />По исходному коду вроде бы не вижу ничего критичного, для AT_KEYEXCHANGE должно работать. Получения значения хэша, к слову, там нет. Мысли по улучшению после отладки:[SPOILER]<div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">if (!pKeyInfo->dwKeySpec == AT_KEYEXCHANGE) {
LogLastError("NOT AT_KEYEXCHANGE");
return false;
}
...
DWORD cbSignature;
if (!CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, 0, NULL, &cbSignature)) {
LogLastError("Error CryptSignHash");
return false;
}
BYTE* pbSignature = new BYTE[cbSignature];
if (!CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, 0, pbSignature, &cbSignature)) {
LogLastError("Error CryptSignHash");
return false;
}</code></pre>
</div></div>urn:https:--www-cryptopro-ru:ftPosts:st1:meid132956:1СМЭВ 3.x<ns1:SenderProvidedRequestData xmlns:ns1="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.2" Id="SIGNED_BY_CONSUMER"><ns1:MessageID>db0486d0-3c08-11e5-95e2-d4c9eff07b77</ns1:MessageID><ns2:MessagePrimaryContent xmlns:ns2="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.2"><ns3:ESIADataVerifyRequest xmlns:ns3="urn://mincomsvyaz/esia/uprid/1.4.3"><ns3:RoutingCode>TESIA</ns3:RoutingCode><ns3:passportSeries>1111</ns3:passportSeries><ns3:passportNumber>111111</ns3:passportNumber><ns3:lastName>Тестов</ns3:lastName><ns3:firstName>Тест</ns3:firstName><ns3:middleName>Тестович</ns3:middleName><ns3:snils>229-785-346 20</ns3:snils></ns3:ESIADataVerifyRequest></ns2:MessagePrimaryContent><ns1:TestMessage></ns1:TestMessage></ns1:SenderProvidedRequestData><br />2022-05-11T11:31:07+03:002022-05-11T11:31:07+03:00DanilaK<ns1:SenderProvidedRequestData xmlns:ns1="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.2" Id="SIGNED_BY_CONSUMER"><ns1:MessageID>db0486d0-3c08-11e5-95e2-d4c9eff07b77</ns1:MessageID><ns2:MessagePrimaryContent xmlns:ns2="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.2"><ns3:ESIADataVerifyRequest xmlns:ns3="urn://mincomsvyaz/esia/uprid/1.4.3"><ns3:RoutingCode>TESIA</ns3:RoutingCode><ns3:passportSeries>1111</ns3:passportSeries><ns3:passportNumber>111111</ns3:passportNumber><ns3:lastName>Тестов</ns3:lastName><ns3:firstName>Тест</ns3:firstName><ns3:middleName>Тестович</ns3:middleName><ns3:snils>229-785-346 20</ns3:snils></ns3:ESIADataVerifyRequest></ns2:MessagePrimaryContent><ns1:TestMessage></ns1:TestMessage></ns1:SenderProvidedRequestData><br />urn:https:--www-cryptopro-ru:ftPosts:st1:meid128518:1СМЭВ 3.xC:\Program Files (x86)\Crypto Pro\CSP>csptest -keys -cont HDIMAGE\\a0bd5a58.000\E30D -sign GOST12_256 -keytype exchange -in "C:\Job\DataXml.txt" -out "C:\Job\DataXml1.txt"2021-11-02T16:57:44+03:002021-11-02T16:57:44+03:00rafaelkhasanovC:\Program Files (x86)\Crypto Pro\CSP>csptest -keys -cont HDIMAGE\\a0bd5a58.000\E30D -sign GOST12_256 -keytype exchange -in "C:\Job\DataXml.txt" -out "C:\Job\DataXml1.txt"urn:https:--www-cryptopro-ru:ftPosts:st1:meid122349:1СМЭВ 3.x<table class="content postContainer" width="100%"><tr><td>del</td></tr></table>2021-01-26T07:59:21+03:002021-01-26T07:59:21+03:00two_oceans<table class="content postContainer" width="100%"><tr><td>del</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid122348:1СМЭВ 3.x<table class="content postContainer_Alt" width="100%"><tr><td>Добрый день.<br />Если еще нужно - я первый раз зашел в новом году. С подписью проблем не вижу - проверяется корректно. В коде махинации не особо понятны, но выходит верно.<br /><br />Если отправляете именно то, что выделено желтым и ничего более прямо в СМЭВ, то проблема проста: нет контейнера SOAP, парсер ругается на то что корневой тег не Soap:Envelope. Выделенный желтым текст должен быть внутри Soap:Envelope / Soap:Body, а Soap:Envelope / Soap:Header оставить пустым. В норме MessageTypeSelector уходит на адаптер СМЭВ, который делает обертки smev:GetRequestRequest и Soap:Envelope / Soap:Body, подписывает MessageTypeSelector и отправляет все в СМЭВ 3. Однако раз часть GetRequestRequest обернули сами и подписываете сами, то надо и самую внешнюю обертку Soap добавить.</td></tr></table>2021-01-26T08:01:33+03:002021-01-26T08:01:33+03:00two_oceans<table class="content postContainer_Alt" width="100%"><tr><td>Добрый день.<br />Если еще нужно - я первый раз зашел в новом году. С подписью проблем не вижу - проверяется корректно. В коде махинации не особо понятны, но выходит верно.<br /><br />Если отправляете именно то, что выделено желтым и ничего более прямо в СМЭВ, то проблема проста: нет контейнера SOAP, парсер ругается на то что корневой тег не Soap:Envelope. Выделенный желтым текст должен быть внутри Soap:Envelope / Soap:Body, а Soap:Envelope / Soap:Header оставить пустым. В норме MessageTypeSelector уходит на адаптер СМЭВ, который делает обертки smev:GetRequestRequest и Soap:Envelope / Soap:Body, подписывает MessageTypeSelector и отправляет все в СМЭВ 3. Однако раз часть GetRequestRequest обернули сами и подписываете сами, то надо и самую внешнюю обертку Soap добавить.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid122018:1СМЭВ 3.x<table class="content postContainer" width="100%"><tr><td>Доброго времени суток. От коллеги (который уже уволился) остался СМЭВ<br />Сижу разбираюсь, но тема сложная<br />В итоге получился следующий документ<br /><br /><span class="highlight"><smev:GetRequestRequest xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:smevbasic="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.2" xmlns:faults="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/faults/1.2" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:smev="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.2"><br /> <smevbasic:MessageTypeSelector Id="SIGNED_BY_CONSUMER"><br /> <smevbasic:Timestamp>2021-01-15T00:07:06.9541401+04:00</smevbasic:Timestamp><br /> </smevbasic:MessageTypeSelector><br /> <smev:CallerInformationSystemSignature><br /> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><br /> <SignedInfo><br /> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><br /> <SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256" /><br /> <Reference URI="#SIGNED_BY_CONSUMER"><br /> <Transforms><br /> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><br /> <Transform Algorithm="urn://smev-gov-ru/xmldsig/transform" /><br /> </Transforms><br /> <DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256" /><br /> <DigestValue>Nq3ZumwSn8VJvbN2dC0eSnzytbje/2NhQnfoOtOStE8=</DigestValue><br /> </Reference><br /> </SignedInfo><br /> <SignatureValue>qUBhKRML951sSKO/W6vpaMLQ35x46HeKwF14pRH26D9xmL6earCG+EhacSZcK9qUpKmXOtUBBdP2kI+fVjCzYw==</SignatureValue><br /> <KeyInfo><br /> <X509Data><br /> <X509Certificate>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</X509Certificate><br /> </X509Data><br /> </KeyInfo><br /> </Signature><br /> </smev:CallerInformationSystemSignature><br /></smev:GetRequestRequest></span><br /><br />При попытке отправить в СМЭВ получаю ошибку:<br />Data at the root level is invalid. Line 2, position 1.<br />Не могу понять в чем дело, подскажите пожалуйста хотя бы куда копать<br /><br />Код подписи, метод CheckSignature() возвращает true<br /><br /> var certificate = GetCertificate(certificateSerial);<br /><br /> var smevSignedXml = new SmevSignedXml(xmlDocument)<br /> {<br /> SigningKey = certificate.PrivateKey,<br /> KeyInfo = new KeyInfo()<br /> };<br /><br /> smevSignedXml.KeyInfo.AddClause(new KeyInfoX509Data(certificate));<br /><br /> Reference reference = new Reference<br /> {<br /> Uri = $"#{id}",<br /> DigestMethod = CPSignedXml.XmlDsigGost3411_2012_256Url<br /> };<br /><br /> reference.AddTransform(new XmlDsigExcC14NTransform());<br /> reference.AddTransform(new XmlDsigSmevTransform());<br /> smevSignedXml.SafeCanonicalizationMethods.Add("urn://smev-gov-ru/xmldsig/transform");<br /> smevSignedXml.AddReference(reference);<br /><br /> smevSignedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;<br /> smevSignedXml.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410_2012_256Url;<br /><br /> smevSignedXml.ComputeSignature();<br /><br /> var signatureXml = smevSignedXml.GetXml();<br /><br /> var binaryData = new XmlDocument();<br /><br /> var keyInfo = binaryData.CreateElement("KeyInfo", "http://www.w3.org/2000/09/xmldsig#");<br /><br /> var X509Data = binaryData.CreateElement("X509Data", "http://www.w3.org/2000/09/xmldsig#");<br /> var X509Certificate = binaryData.CreateElement("ds:X509Certificate", "http://www.w3.org/2000/09/xmldsig#");<br /> X509Certificate.InnerText = Convert.ToBase64String(certificate.RawData);<br /><br /> X509Data.AppendChild(X509Certificate);<br /><br /> keyInfo.AppendChild(X509Data);<br /><br /> signatureXml.InnerXml += binaryData.OuterXml;<br /><br /> var signature = binaryData.CreateElement("Signature", "http://www.w3.org/2000/09/xmldsig#");<br /><br /> signature.InnerXml = signatureXml.InnerXml;<br /><br /> var isValid = smevSignedXml.CheckSignature();<br /><br /> return signature;<br /><br />Буду очень признателен за любую помощь, времени к сожалению, совсем мало</td></tr></table>2021-01-15T01:04:38+03:002021-01-15T01:04:38+03:00vyacheslav123456789<table class="content postContainer" width="100%"><tr><td>Доброго времени суток. От коллеги (который уже уволился) остался СМЭВ<br />Сижу разбираюсь, но тема сложная<br />В итоге получился следующий документ<br /><br /><span class="highlight"><smev:GetRequestRequest xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:smevbasic="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.2" xmlns:faults="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/faults/1.2" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:smev="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.2"><br /> <smevbasic:MessageTypeSelector Id="SIGNED_BY_CONSUMER"><br /> <smevbasic:Timestamp>2021-01-15T00:07:06.9541401+04:00</smevbasic:Timestamp><br /> </smevbasic:MessageTypeSelector><br /> <smev:CallerInformationSystemSignature><br /> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><br /> <SignedInfo><br /> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><br /> <SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256" /><br /> <Reference URI="#SIGNED_BY_CONSUMER"><br /> <Transforms><br /> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><br /> <Transform Algorithm="urn://smev-gov-ru/xmldsig/transform" /><br /> </Transforms><br /> <DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256" /><br /> <DigestValue>Nq3ZumwSn8VJvbN2dC0eSnzytbje/2NhQnfoOtOStE8=</DigestValue><br /> </Reference><br /> </SignedInfo><br /> <SignatureValue>qUBhKRML951sSKO/W6vpaMLQ35x46HeKwF14pRH26D9xmL6earCG+EhacSZcK9qUpKmXOtUBBdP2kI+fVjCzYw==</SignatureValue><br /> <KeyInfo><br /> <X509Data><br /> <X509Certificate>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</X509Certificate><br /> </X509Data><br /> </KeyInfo><br /> </Signature><br /> </smev:CallerInformationSystemSignature><br /></smev:GetRequestRequest></span><br /><br />При попытке отправить в СМЭВ получаю ошибку:<br />Data at the root level is invalid. Line 2, position 1.<br />Не могу понять в чем дело, подскажите пожалуйста хотя бы куда копать<br /><br />Код подписи, метод CheckSignature() возвращает true<br /><br /> var certificate = GetCertificate(certificateSerial);<br /><br /> var smevSignedXml = new SmevSignedXml(xmlDocument)<br /> {<br /> SigningKey = certificate.PrivateKey,<br /> KeyInfo = new KeyInfo()<br /> };<br /><br /> smevSignedXml.KeyInfo.AddClause(new KeyInfoX509Data(certificate));<br /><br /> Reference reference = new Reference<br /> {<br /> Uri = $"#{id}",<br /> DigestMethod = CPSignedXml.XmlDsigGost3411_2012_256Url<br /> };<br /><br /> reference.AddTransform(new XmlDsigExcC14NTransform());<br /> reference.AddTransform(new XmlDsigSmevTransform());<br /> smevSignedXml.SafeCanonicalizationMethods.Add("urn://smev-gov-ru/xmldsig/transform");<br /> smevSignedXml.AddReference(reference);<br /><br /> smevSignedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;<br /> smevSignedXml.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410_2012_256Url;<br /><br /> smevSignedXml.ComputeSignature();<br /><br /> var signatureXml = smevSignedXml.GetXml();<br /><br /> var binaryData = new XmlDocument();<br /><br /> var keyInfo = binaryData.CreateElement("KeyInfo", "http://www.w3.org/2000/09/xmldsig#");<br /><br /> var X509Data = binaryData.CreateElement("X509Data", "http://www.w3.org/2000/09/xmldsig#");<br /> var X509Certificate = binaryData.CreateElement("ds:X509Certificate", "http://www.w3.org/2000/09/xmldsig#");<br /> X509Certificate.InnerText = Convert.ToBase64String(certificate.RawData);<br /><br /> X509Data.AppendChild(X509Certificate);<br /><br /> keyInfo.AppendChild(X509Data);<br /><br /> signatureXml.InnerXml += binaryData.OuterXml;<br /><br /> var signature = binaryData.CreateElement("Signature", "http://www.w3.org/2000/09/xmldsig#");<br /><br /> signature.InnerXml = signatureXml.InnerXml;<br /><br /> var isValid = smevSignedXml.CheckSignature();<br /><br /> return signature;<br /><br />Буду очень признателен за любую помощь, времени к сожалению, совсем мало</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid120026:1СМЭВ 3.x<table class="content postContainer_Alt" width="100%"><tr><td>Лично меня смущает что там "//AttachmentContent/@Id", так как собаку ставят перед именем атрибута, но Id в схеме это element (то есть, тег?). Но тогда извлечение должно быть вроде такого "//AttachmentContent/Id/textnode()". Про RequestEntry/@Id вопросов нет, там именно атрибут. Выходит какая-то ерунда: в AttachmentContent должен быть еще и атрибут Id.</td></tr></table>2020-10-24T13:22:34+03:002020-10-24T13:22:34+03:00two_oceans<table class="content postContainer_Alt" width="100%"><tr><td>Лично меня смущает что там "//AttachmentContent/@Id", так как собаку ставят перед именем атрибута, но Id в схеме это element (то есть, тег?). Но тогда извлечение должно быть вроде такого "//AttachmentContent/Id/textnode()". Про RequestEntry/@Id вопросов нет, там именно атрибут. Выходит какая-то ерунда: в AttachmentContent должен быть еще и атрибут Id.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid119933:1СМЭВ 3.x<table class="content postContainer" width="100%"><tr><td>По тестовому <a rel="nofollow" href="https://smev3.gosuslugi.ru/portal/inquirytype_scenario_one.jsp?zone=fed&itoid=140406&id=17183" title="https://smev3.gosuslugi.ru/portal/inquirytype_scenario_one.jsp?zone=fed&itoid=140406&id=17183">сценарию</a> получается, что ImportCertificateRequest/RequestEntry/@Id должен быть равен 'I_6e188de4-8491-49ea-8ec6-a09a607d020a'.<br /><br />По схеме Common.xsd, получается, что RequestEntry/@Id (type="xsd:IDREF") - это "уникальный в пределах запроса идентификатор описания сертификата используемый для поиска самого сертификата в элементе basic:AttachmentContentList запроса СМЭВ".<br /><br />По схеме smev-message-exchange-basic-1.xsd указано, что элемент AttachmentHeaderList/AttachmentHeader/contentId - идентификатор вложения. Ссылка на соответствующий //AttachmentContent/@Id.<br /><br />Заполняю эти три идентификатора одинаковым значением I_6e188de4-8491-49ea-8ec6-a09a607d020a, но ошибка всё та же:<br />cvc-id.1: There is no ID/IDREF binding for IDREF 'I_6e188de4-8491-49ea-8ec6-a09a607d020a'.<br /><br />Не понимаю, с какой ссылкой должно быть ещё совпадение :(((<br /><br />Прикреплю файл smev-message-exchange-basic-1.xsd<br />[attach]9189[/attach]<br /></td></tr></table>2020-10-21T16:52:43+03:002020-10-21T16:52:43+03:00Соня Базурова<table class="content postContainer" width="100%"><tr><td>По тестовому <a rel="nofollow" href="https://smev3.gosuslugi.ru/portal/inquirytype_scenario_one.jsp?zone=fed&itoid=140406&id=17183" title="https://smev3.gosuslugi.ru/portal/inquirytype_scenario_one.jsp?zone=fed&itoid=140406&id=17183">сценарию</a> получается, что ImportCertificateRequest/RequestEntry/@Id должен быть равен 'I_6e188de4-8491-49ea-8ec6-a09a607d020a'.<br /><br />По схеме Common.xsd, получается, что RequestEntry/@Id (type="xsd:IDREF") - это "уникальный в пределах запроса идентификатор описания сертификата используемый для поиска самого сертификата в элементе basic:AttachmentContentList запроса СМЭВ".<br /><br />По схеме smev-message-exchange-basic-1.xsd указано, что элемент AttachmentHeaderList/AttachmentHeader/contentId - идентификатор вложения. Ссылка на соответствующий //AttachmentContent/@Id.<br /><br />Заполняю эти три идентификатора одинаковым значением I_6e188de4-8491-49ea-8ec6-a09a607d020a, но ошибка всё та же:<br />cvc-id.1: There is no ID/IDREF binding for IDREF 'I_6e188de4-8491-49ea-8ec6-a09a607d020a'.<br /><br />Не понимаю, с какой ссылкой должно быть ещё совпадение :(((<br /><br />Прикреплю файл smev-message-exchange-basic-1.xsd<br />[attach]9189[/attach]<br /></td></tr></table>