Atom Лента - Форум КриптоПро - Тема:Верификация откреплённой подписи xml средствами Net. - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:VerifikacijaotkrepljonnojjpodpisixmlsredstvamiNet.-10:1Copyright 2024 Форум КриптоПро2024-03-29T15:30:45Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruDmitrii Fhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=56458&name=Dmitrii FDmitrii Fhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=56458&name=Dmitrii FDmitrii Fhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=56458&name=Dmitrii Ftwo_oceanshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=36490&name=two_oceansDmitrii Fhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=56458&name=Dmitrii FDmitrii Fhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=56458&name=Dmitrii Ftwo_oceanshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=36490&name=two_oceansDmitrii Fhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=56458&name=Dmitrii FDmitrii Fhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=56458&name=Dmitrii FDmitrii Fhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=56458&name=Dmitrii FDmitrii Fhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=56458&name=Dmitrii FYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid116579:1Верификация откреплённой подписи xml средствами Net.<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: two_oceans <a href="/forum2/default.aspx?g=posts&m=116478#post116478"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>В принципе, где-то здесь на форуме была инструкция как включить отладку проверки подписей в .Net и тогда сможете это наглядно увидеть</div></div><br />Я видел это в одной из тем, только точно не помню в какой именно.<br />Там, вроде бы, с помощью рефлекторов отладку предлагается проводить.<br /></td></tr></table>2020-06-28T00:44:48+03:002020-06-28T00:44:48+03:00Dmitrii F<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: two_oceans <a href="/forum2/default.aspx?g=posts&m=116478#post116478"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>В принципе, где-то здесь на форуме была инструкция как включить отладку проверки подписей в .Net и тогда сможете это наглядно увидеть</div></div><br />Я видел это в одной из тем, только точно не помню в какой именно.<br />Там, вроде бы, с помощью рефлекторов отладку предлагается проводить.<br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid116488:1Верификация откреплённой подписи xml средствами Net.<table class="content postContainer" width="100%"><tr><td>Спасибо за ответ.<br /><br />Однако, подпись в Net., которая проходит проверку, создаётся, также, откреплённая.<br />Т.е.<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup"><Signature><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#WithComments"/><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#WithComments"/></Transforms><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><DigestValue>BpyqygrUdUmyy66XwYlFYcJyXDxDuK6uONl3b6yskLc=</DigestValue></Reference></SignedInfo><SignatureValue>DwzdGxaoV30hLLlyyaZ+zqkjzJqdY3mNG2LxNXL3eYV33fc1plZSLzeAMpqzEyflD68dXnVhTGr33zDuQ5lx4w==</SignatureValue><KeyInfo><X509Data><X509Certificate>..................</X509Certificate></X509Data></KeyInfo></Signature></code></pre>
</div></div><br /><br />А что Вы думаете об <a rel="nofollow" href="https://stackoverflow.com/questions/47104076/c-sharp-fails-to-verify-ecdsa-384-bit-base-64-digital-signature-from-openssl-c" title="https://stackoverflow.com/questions/47104076/c-sharp-fails-to-verify-ecdsa-384-bit-base-64-digital-signature-from-openssl-c">этом</a>?<br /><br /><br /></td></tr></table>2020-06-25T12:15:07+03:002020-06-25T12:15:07+03:00Dmitrii F<table class="content postContainer" width="100%"><tr><td>Спасибо за ответ.<br /><br />Однако, подпись в Net., которая проходит проверку, создаётся, также, откреплённая.<br />Т.е.<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup"><Signature><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#WithComments"/><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#WithComments"/></Transforms><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><DigestValue>BpyqygrUdUmyy66XwYlFYcJyXDxDuK6uONl3b6yskLc=</DigestValue></Reference></SignedInfo><SignatureValue>DwzdGxaoV30hLLlyyaZ+zqkjzJqdY3mNG2LxNXL3eYV33fc1plZSLzeAMpqzEyflD68dXnVhTGr33zDuQ5lx4w==</SignatureValue><KeyInfo><X509Data><X509Certificate>..................</X509Certificate></X509Data></KeyInfo></Signature></code></pre>
</div></div><br /><br />А что Вы думаете об <a rel="nofollow" href="https://stackoverflow.com/questions/47104076/c-sharp-fails-to-verify-ecdsa-384-bit-base-64-digital-signature-from-openssl-c" title="https://stackoverflow.com/questions/47104076/c-sharp-fails-to-verify-ecdsa-384-bit-base-64-digital-signature-from-openssl-c">этом</a>?<br /><br /><br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid116478:1Верификация откреплённой подписи xml средствами Net.<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Dmitrii F <a href="/forum2/default.aspx?g=posts&m=116059#post116059"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Однако, в моём случае значения Digest (хэш) совпадают в openssl и Net.<br />для алгоритма gost_2012. А вот Signature проходит проверку только та, что сформирована в Net.</div></div>При подписании хэши совпадают, так и задумано. А вот какой хэш получается при проверке (точнее от какого фрагмента) - совсем другая история. Когда подпись сформировали вручную из заданного хэша, Вы можете ошибаться с тем, какой фрагмент реально будет проверяться по сформированной Вами подписи.<br /><br />В принципе, где-то здесь на форуме была инструкция как включить отладку проверки подписей в .Net и тогда сможете это наглядно увидеть. Для чистоты примера можете еще прикрепить успешно проверяемую подпись из .NET? Пока опишу примерно что происходит при проверке вышеприведенных подписей из архива.<br /><br />В продемонстрированном примере (где подпись в отдельном файле и там кроме подписи ничего нет) без указания имени исходного файла такая подпись не сработает. Без enveloped при проверке URI="" вычислится хэш от самой готовой подписи вместо каноничного исходного текста, а с enveloped вычислится хэш от пустой строки вместо каноничного исходного текста. То есть SignatureValue успешно проверится, но DigestValue не совпадет.<br /><br />Указание только решетки и идентификатора на это не повлияет, так как в файле с подписью нет такого идентификатора, парсер не знает из какого файла взять фрагмент с таким идентификатором и скорее всего выберется пустая строка от которой посчитается хэш. Аналогично SignatureValue успешно проверится, но DigestValue не совпадет.<br /><br />Итого, если имя файла не указано в URI, то подпись с решеткой + идентификатором и enveloped должна быть в том же файле, что и подписанные данные.</td></tr></table>2020-06-25T05:52:31+03:002020-06-25T05:52:31+03:00two_oceans<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Dmitrii F <a href="/forum2/default.aspx?g=posts&m=116059#post116059"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Однако, в моём случае значения Digest (хэш) совпадают в openssl и Net.<br />для алгоритма gost_2012. А вот Signature проходит проверку только та, что сформирована в Net.</div></div>При подписании хэши совпадают, так и задумано. А вот какой хэш получается при проверке (точнее от какого фрагмента) - совсем другая история. Когда подпись сформировали вручную из заданного хэша, Вы можете ошибаться с тем, какой фрагмент реально будет проверяться по сформированной Вами подписи.<br /><br />В принципе, где-то здесь на форуме была инструкция как включить отладку проверки подписей в .Net и тогда сможете это наглядно увидеть. Для чистоты примера можете еще прикрепить успешно проверяемую подпись из .NET? Пока опишу примерно что происходит при проверке вышеприведенных подписей из архива.<br /><br />В продемонстрированном примере (где подпись в отдельном файле и там кроме подписи ничего нет) без указания имени исходного файла такая подпись не сработает. Без enveloped при проверке URI="" вычислится хэш от самой готовой подписи вместо каноничного исходного текста, а с enveloped вычислится хэш от пустой строки вместо каноничного исходного текста. То есть SignatureValue успешно проверится, но DigestValue не совпадет.<br /><br />Указание только решетки и идентификатора на это не повлияет, так как в файле с подписью нет такого идентификатора, парсер не знает из какого файла взять фрагмент с таким идентификатором и скорее всего выберется пустая строка от которой посчитается хэш. Аналогично SignatureValue успешно проверится, но DigestValue не совпадет.<br /><br />Итого, если имя файла не указано в URI, то подпись с решеткой + идентификатором и enveloped должна быть в том же файле, что и подписанные данные.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid116128:1Верификация откреплённой подписи xml средствами Net.<table class="content postContainer" width="100%"><tr><td>Попробовал вариант с enveloped - с идентификатором (#)/без него.<br />Проверку не проходит (если создавать в openssl)<br /><br />Если создавать средствами .Net, то проверку проходит.</td></tr></table>2020-06-11T08:57:10+03:002020-06-11T08:57:10+03:00Dmitrii F<table class="content postContainer" width="100%"><tr><td>Попробовал вариант с enveloped - с идентификатором (#)/без него.<br />Проверку не проходит (если создавать в openssl)<br /><br />Если создавать средствами .Net, то проверку проходит.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid116059:1Верификация откреплённой подписи xml средствами Net.<br />Используются данные технологии для интеграции 1C с внешним источником.<br />openssl+gost2012_256 (gost engine) "выполняют" формальные требования.<br />2020-06-08T15:09:08+03:002020-06-08T15:09:08+03:00Dmitrii F<br />Используются данные технологии для интеграции 1C с внешним источником.<br />openssl+gost2012_256 (gost engine) "выполняют" формальные требования.<br />urn:https:--www-cryptopro-ru:ftPosts:st1:meid116051:1Верификация откреплённой подписи xml средствами Net.Еще становится любопытно под какие такие задачи в реальной работе криптооперации нужно делать гост-2012 через openssl (в которой нет встроенной поддержки гост-2012) со сторонним несертифицированным модулем с гитхаба (хотя конечно есть и платный сертифицированный вариант, но про него похоже речи не идет раз пошли разговоры про сборку openssl). Задачи для которых придется мастерить именно на основе openssl (несертифицированного!) уж извините крайне ограничены. Например, тоже в своем решении пару-тройку лет назад думал поддержать openssl наряду с cryptoapi, но потом свернул это направление из-за слишком громоздкой и несертифицированной конструкции.2020-06-08T08:13:06+03:002020-06-08T08:13:06+03:00two_oceansЕще становится любопытно под какие такие задачи в реальной работе криптооперации нужно делать гост-2012 через openssl (в которой нет встроенной поддержки гост-2012) со сторонним несертифицированным модулем с гитхаба (хотя конечно есть и платный сертифицированный вариант, но про него похоже речи не идет раз пошли разговоры про сборку openssl). Задачи для которых придется мастерить именно на основе openssl (несертифицированного!) уж извините крайне ограничены. Например, тоже в своем решении пару-тройку лет назад думал поддержать openssl наряду с cryptoapi, но потом свернул это направление из-за слишком громоздкой и несертифицированной конструкции.urn:https:--www-cryptopro-ru:ftPosts:st1:meid116014:1Верификация откреплённой подписи xml средствами Net.<table class="content postContainer_Alt" width="100%"><tr><td>Думаю, что надо добавить расширение к openssl (наподобии rsautil) и пересобрать openssl,<br />чтобы Signature рассчитывалась так-же, как и в Net. <br /><br />Может, кто-то знает, есть ли подобные проекты?<br /><br />В принципе, вот реализация Net.:<br /> <br /><a rel="nofollow" href="https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/signedxml.cs,ec07e01153e4b893" title="https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/signedxml.cs,ec07e01153e4b893">ComputeSignature Net.</a><br /><br />openssl:<br /><br /><a rel="nofollow" href="https://github.com/openssl/openssl/tree/master/crypto/evp" title="https://github.com/openssl/openssl/tree/master/crypto/evp">функции openssl для рассчёта Signature</a><br /><br /><a rel="nofollow" href="https://wiki.openssl.org/index.php/EVP_Signing_and_Verifying#Signing" title="https://wiki.openssl.org/index.php/EVP_Signing_and_Verifying#Signing">Пример создания Signature openssl API</a><br /><br /><a rel="nofollow" href="https://github.com/openssl/openssl/blob/master/apps/rsautl.c" title="https://github.com/openssl/openssl/blob/master/apps/rsautl.c">rsautil</a></td></tr></table>2020-06-05T22:18:07+03:002020-06-05T22:18:07+03:00Dmitrii F<table class="content postContainer_Alt" width="100%"><tr><td>Думаю, что надо добавить расширение к openssl (наподобии rsautil) и пересобрать openssl,<br />чтобы Signature рассчитывалась так-же, как и в Net. <br /><br />Может, кто-то знает, есть ли подобные проекты?<br /><br />В принципе, вот реализация Net.:<br /> <br /><a rel="nofollow" href="https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/signedxml.cs,ec07e01153e4b893" title="https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/signedxml.cs,ec07e01153e4b893">ComputeSignature Net.</a><br /><br />openssl:<br /><br /><a rel="nofollow" href="https://github.com/openssl/openssl/tree/master/crypto/evp" title="https://github.com/openssl/openssl/tree/master/crypto/evp">функции openssl для рассчёта Signature</a><br /><br /><a rel="nofollow" href="https://wiki.openssl.org/index.php/EVP_Signing_and_Verifying#Signing" title="https://wiki.openssl.org/index.php/EVP_Signing_and_Verifying#Signing">Пример создания Signature openssl API</a><br /><br /><a rel="nofollow" href="https://github.com/openssl/openssl/blob/master/apps/rsautl.c" title="https://github.com/openssl/openssl/blob/master/apps/rsautl.c">rsautil</a></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid115949:1Верификация откреплённой подписи xml средствами Net.<table class="content postContainer" width="100%"><tr><td>Судя по всему, реализации создания Signature<br />данных openssl и Net. различаются, поэтому<br />и не проходит верификацию.<br /><a rel="nofollow" href="https://habr.com/ru/post/68591/" title="https://habr.com/ru/post/68591/">информация</a><br /><br />Вероятно, что нужно реализовывать wrapper для openssl или<br />использовать сторонние библиотеки, в которых этот функционал уже есть.<br /><br />А ещё, можно попробовать использовать функцию<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-vb">VerifyData()</code></pre>
</div></div><br /><br /><a rel="nofollow" href="https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.rsacryptoserviceprovider.verifydata?view=netcore-3.1" title="https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.rsacryptoserviceprovider.verifydata?view=netcore-3.1">1</a>,<a rel="nofollow" href="https://cpdn.cryptopro.ru/content/cpnet/html/M_CryptoPro_Sharpei_Gost3410_2012_256CryptoServiceProvider_VerifyData_3_cc76b869.htm" title="https://cpdn.cryptopro.ru/content/cpnet/html/M_CryptoPro_Sharpei_Gost3410_2012_256CryptoServiceProvider_VerifyData_3_cc76b869.htm">2</a><br /><br />Скажите пожалуйста, что вы об этом думаете?</td></tr></table>2020-06-04T18:11:08+03:002020-06-04T18:11:08+03:00Dmitrii F<table class="content postContainer" width="100%"><tr><td>Судя по всему, реализации создания Signature<br />данных openssl и Net. различаются, поэтому<br />и не проходит верификацию.<br /><a rel="nofollow" href="https://habr.com/ru/post/68591/" title="https://habr.com/ru/post/68591/">информация</a><br /><br />Вероятно, что нужно реализовывать wrapper для openssl или<br />использовать сторонние библиотеки, в которых этот функционал уже есть.<br /><br />А ещё, можно попробовать использовать функцию<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-vb">VerifyData()</code></pre>
</div></div><br /><br /><a rel="nofollow" href="https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.rsacryptoserviceprovider.verifydata?view=netcore-3.1" title="https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.rsacryptoserviceprovider.verifydata?view=netcore-3.1">1</a>,<a rel="nofollow" href="https://cpdn.cryptopro.ru/content/cpnet/html/M_CryptoPro_Sharpei_Gost3410_2012_256CryptoServiceProvider_VerifyData_3_cc76b869.htm" title="https://cpdn.cryptopro.ru/content/cpnet/html/M_CryptoPro_Sharpei_Gost3410_2012_256CryptoServiceProvider_VerifyData_3_cc76b869.htm">2</a><br /><br />Скажите пожалуйста, что вы об этом думаете?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid115942:1Верификация откреплённой подписи xml средствами Net.<table class="content postContainer_Alt" width="100%"><tr><td>Выяснил, что правильный вариант получения закрытого/открытоко ключа<br />в .Net>4.6 (на примере RSA ключа):<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-vb">
Dim privateKey As RSA = cert.GetRSAPrivateKey()
</code></pre>
</div></div></td></tr></table>2020-06-04T15:45:06+03:002020-06-04T15:45:06+03:00Dmitrii F<table class="content postContainer_Alt" width="100%"><tr><td>Выяснил, что правильный вариант получения закрытого/открытоко ключа<br />в .Net>4.6 (на примере RSA ключа):<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-vb">
Dim privateKey As RSA = cert.GetRSAPrivateKey()
</code></pre>
</div></div></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid115839:1Верификация откреплённой подписи xml средствами Net.<table class="content postContainer" width="100%"><tr><td>Упаковав сертификат rsa-sha256 с закрытым ключём в формат pkcs12,<br />создал откреплённую подпись для xml документа средствами .Net<br />, импортировав сертификат и ключ:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-vb">
Dim cert As X509Certificate2 = New X509Certificate2("cert.p12", "password")
Dim Key As AsymmetricAlgorithm = cert.PrivateKey
</code></pre>
</div></div><br />Единственный момент, что в данном случае, алгоритм рассчёта Signature:rsa-sha256<br />не подошёл (исключение) почему-то, хотя я и создавал сертификат rsa-sha256:<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-bash">
openssl x509 -req -sha256 -in c_rsa_sha256.csr -out example_rsa_sha256.pem -signkey example_rsa_sha256.key -days 365
</code></pre>
</div></div><br /><br />Поэтому, пришлось вручную выставить алгоритм rsa-sha1:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-vb">
SignedXML_.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url
</code></pre>
</div></div><br /><br />Такая подпись проверку прошла.<br />Значит, сертификат валидный для .Net.<br /></td></tr></table>2020-06-03T01:07:52+03:002020-06-03T01:07:52+03:00Dmitrii F<table class="content postContainer" width="100%"><tr><td>Упаковав сертификат rsa-sha256 с закрытым ключём в формат pkcs12,<br />создал откреплённую подпись для xml документа средствами .Net<br />, импортировав сертификат и ключ:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-vb">
Dim cert As X509Certificate2 = New X509Certificate2("cert.p12", "password")
Dim Key As AsymmetricAlgorithm = cert.PrivateKey
</code></pre>
</div></div><br />Единственный момент, что в данном случае, алгоритм рассчёта Signature:rsa-sha256<br />не подошёл (исключение) почему-то, хотя я и создавал сертификат rsa-sha256:<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-bash">
openssl x509 -req -sha256 -in c_rsa_sha256.csr -out example_rsa_sha256.pem -signkey example_rsa_sha256.key -days 365
</code></pre>
</div></div><br /><br />Поэтому, пришлось вручную выставить алгоритм rsa-sha1:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-vb">
SignedXML_.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url
</code></pre>
</div></div><br /><br />Такая подпись проверку прошла.<br />Значит, сертификат валидный для .Net.<br /></td></tr></table>