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

Уведомление

Icon
Error

36 Страницы«<2526272829>»
Опции
К последнему сообщению К первому непрочитанному
Offline yalandaev  
#261 Оставлено : 27 сентября 2022 г. 11:34:50(UTC)
yalandaev

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

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

Сказал(а) «Спасибо»: 3 раз
Добрый день!
Ранее я не слишком много работал с криптографией, поэтому мои вопросы будут возможно наивными, а терминология не верна. Тем не менее, буду очень благодарен за ответ.

Предположим, что стоит задача реализации шифрования/расшифрования и подписания/проверки подписи (CAdES и XAdES, вплоть до форматов -A (архивный)) по ГОСТовским алгоритмам с применением КриптоПро CSP на Linux. Всё это оформлено в виде веб-сервиса, а токен с ключем условно торчит в сервере (т.е. подписывать будет не человек, а сервис. Так понимаю, тут есть нюансы с пин-кодами для доступа к ключу)

Пока мне известно два варианта -
- Использовать форк CoreFx (https://github.com/CryptoPro/corefx)
- Использовать любую версию .NET Core, но КриптоПро CSP использовать через p/invoke - использовать неуправляемый код, MS CryptoAPI 2.0.

Вопросы:
1) Что можете сказать по каждому из вариантов? Осуществимы ли задачи в полном объёме с каждым из этих вариантов, нет ли ограничений?
2) Можно ли вкратце дать характеристику форку CoreFX - что было изменено/добавлено, позволяет ли в полной мере использовать всю функциональность КриптоПро CSP? Правильно ли я понимаю, что используя форк не придётся вообще обращаться к MS CryptoAPI 2.0?
3) Вариант с p/invoke выглядит гораздо более трудоёмким. Какие тут могут быть проблемы при реализации?
Offline Андрей Врагов  
#262 Оставлено : 28 сентября 2022 г. 11:09:40(UTC)
Андрей Врагов

Статус: Участник

Группы: Участники
Зарегистрирован: 11.04.2017(UTC)
Сообщений: 25

Сказал(а) «Спасибо»: 1 раз
Коллеги из КриптоПро,
можете поподробнее просветить, для чего при установке CoreFx также копировать сборки NetStandard? Я так думал, что вы пропатчили сам CoreFx нашей криптографией, а по сему достаточно добавить только ссылки на сборки System.Security.Cryptography.Pkcs и System.Security.Cryptography.Xml. В чем смысл добавления сборок NetStandard причем не из самого CoreFx?
Offline Артём Макаров  
#263 Оставлено : 28 сентября 2022 г. 11:14:13(UTC)
Артём Макаров

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 20.02.2017(UTC)
Сообщений: 217

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 62 раз в 58 постах
Автор: yalandaev Перейти к цитате
Добрый день!
Ранее я не слишком много работал с криптографией, поэтому мои вопросы будут возможно наивными, а терминология не верна. Тем не менее, буду очень благодарен за ответ.

Предположим, что стоит задача реализации шифрования/расшифрования и подписания/проверки подписи (CAdES и XAdES, вплоть до форматов -A (архивный)) по ГОСТовским алгоритмам с применением КриптоПро CSP на Linux. Всё это оформлено в виде веб-сервиса, а токен с ключем условно торчит в сервере (т.е. подписывать будет не человек, а сервис. Так понимаю, тут есть нюансы с пин-кодами для доступа к ключу)

Пока мне известно два варианта -
- Использовать форк CoreFx (https://github.com/CryptoPro/corefx)
- Использовать любую версию .NET Core, но КриптоПро CSP использовать через p/invoke - использовать неуправляемый код, MS CryptoAPI 2.0.

Вопросы:
1) Что можете сказать по каждому из вариантов? Осуществимы ли задачи в полном объёме с каждым из этих вариантов, нет ли ограничений?
2) Можно ли вкратце дать характеристику форку CoreFX - что было изменено/добавлено, позволяет ли в полной мере использовать всю функциональность КриптоПро CSP? Правильно ли я понимаю, что используя форк не придётся вообще обращаться к MS CryptoAPI 2.0?
3) Вариант с p/invoke выглядит гораздо более трудоёмким. Какие тут могут быть проблемы при реализации?


Форк поддерживает только CMS\XML подписи\шифрования, любые CAdES-образные подписи на linux только через P/Invoke.
Если делаете через P/Invoke форк не нужен - просто пишете обёртки вокруг вызовов csp и используете их. Код во многом будут похож на аналогичный код на Си. Проблемы - ровно те же, что и при написании кода на си.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Артём Макаров за этот пост.
yalandaev оставлено 28.09.2022(UTC)
Offline Артём Макаров  
#264 Оставлено : 28 сентября 2022 г. 11:19:37(UTC)
Артём Макаров

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 20.02.2017(UTC)
Сообщений: 217

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 62 раз в 58 постах
Автор: Андрей Врагов Перейти к цитате
Коллеги из КриптоПро,
можете поподробнее просветить, для чего при установке CoreFx также копировать сборки NetStandard? Я так думал, что вы пропатчили сам CoreFx нашей криптографией, а по сему достаточно добавить только ссылки на сборки System.Security.Cryptography.Pkcs и System.Security.Cryptography.Xml. В чем смысл добавления сборок NetStandard причем не из самого CoreFx?


Вызвано особенностью инфраструктуры исходного проекта. Сборки Xml и Pkcs явно не зависят от сборок криптографии из рантйма, а зависят от нетстандарта, который является "прослойкой".

Т.е. если сборка xml желает воспользоваться криптографией она использует нужные классы из нетстандарта, который вызывает из уже из самого рантайма.

Так как мы изменили рантайм, добавив в него гостовые классы, про которые родной стандарт не знает - пришлось модифицировать и стандарт, дабы Xml и Pkcs могли ими пользоваться.

Сам код стандарта представляет из себя лишь "переброску" классов из рантайма, никокй дополнительной логики, кроме инфраструктурной, там нет. Сам проект стандарта содержит api классов и указание на сборки с реализациями этого api (т.е. ссылка на рантайм).
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Врагов  
#265 Оставлено : 29 сентября 2022 г. 13:27:00(UTC)
Андрей Врагов

Статус: Участник

Группы: Участники
Зарегистрирован: 11.04.2017(UTC)
Сообщений: 25

Сказал(а) «Спасибо»: 1 раз
Автор: Артём Макаров Перейти к цитате
Автор: Андрей Врагов Перейти к цитате
Коллеги из КриптоПро,
можете поподробнее просветить, для чего при установке CoreFx также копировать сборки NetStandard? Я так думал, что вы пропатчили сам CoreFx нашей криптографией, а по сему достаточно добавить только ссылки на сборки System.Security.Cryptography.Pkcs и System.Security.Cryptography.Xml. В чем смысл добавления сборок NetStandard причем не из самого CoreFx?


Вызвано особенностью инфраструктуры исходного проекта. Сборки Xml и Pkcs явно не зависят от сборок криптографии из рантйма, а зависят от нетстандарта, который является "прослойкой".

Т.е. если сборка xml желает воспользоваться криптографией она использует нужные классы из нетстандарта, который вызывает из уже из самого рантайма.

Так как мы изменили рантайм, добавив в него гостовые классы, про которые родной стандарт не знает - пришлось модифицировать и стандарт, дабы Xml и Pkcs могли ими пользоваться.

Сам код стандарта представляет из себя лишь "переброску" классов из рантайма, никокй дополнительной логики, кроме инфраструктурной, там нет. Сам проект стандарта содержит api классов и указание на сборки с реализациями этого api (т.е. ссылка на рантайм).

Артем, а можно более детально?
Насколько я понимаю в глубинах .Net, каждый проект имеет несколько типов зависимостей. Первый тип - зависимость от фреймворка, создается автоматически при указании типа проекта. Например, собственно Net Core - выполняет базовые вещи, Asp Net Core - поддержка Web проектов, WindowsDesktop - поддержка UI для десктопных проектов и т.п.
Каждый фреймворк содержит необходимый набор сборок. Кстати, мне непонятно, почему стандартно сборки System.Security.Cryptography.Pkcs и System.Security.Cryptography.Xml входят во фреймворк Asp Net Core, а не в базовый Net Core. Не по этой ли причине по вашей инструкции их необходимо добавлять в файле проекта?
Вторая зависимость это бинарные пакеты (nuget), которые де факто являются расширением функционала фреймворков.
Третья - это отдельные сборки. В нашем случае мы как раз таким образом указываем сборки Pkcs и Xml.
Четвертая - это другие проекты, включенные в solution.

Первый вопрос, в какой последовательности .Net осуществляет поиск сборок, с требуемыми классами? Поясню. Если, например, проект зависит от фреймворка Asp Net Core, а также в файле проекта отдельно прописаны сборки Pkcs и Xml, то откуда данные сборки будут браться для помещения в папку bin при компиляции проекта?
Второй вопрос. В моем тестовом приложении есть такой код:

Код:

var signerCert = SelectCertificate();
            var ci = new ContentInfo(new Oid(NativeConstants.szOID_PKCS_7_DATA), raw);

            var cms = new SignedCms(ci);

            var attr = new CryptographicAttributeObject(new Oid(NativeConstants.szOID_ENROLLMENT_NAME_VALUE_PAIR));
            var asn = new AsnEncodedData(TemplateEncoder.Encode(attrNVCertTemplate.pwszValue));
            attr.Values.Add(asn);

            if (signerCert != null)
            {

                var digestAlgorithm = new Oid(SelectDigestAlgorithmByCertificate(signerCert));
                var signer = new CmsSigner() { IncludeOption = X509IncludeOption.EndCertOnly, Certificate = signerCert, DigestAlgorithm = digestAlgorithm };
                signer.SignedAttributes.Add(attr);
                cms.ComputeSignature(signer, true);
                var cms2 = new SignedCms(new ContentInfo(new Oid(NativeConstants.szOID_PKCS_7_DATA), cms.Encode()));
                cms2.ComputeSignature(signer, true);


Проект настроен по образу и подобию с вашим тестовым проектом из CoreFx. Ошибка вылетает при вызове метода ComputeSignature. Что где посмотреть? Может я что-то пропустил?
Причем сначала все работало, но потом что-то случилось. Поэтому и пытаюсь понять детали в организации ваших патчей и прочего.
Offline Артём Макаров  
#266 Оставлено : 29 сентября 2022 г. 13:40:22(UTC)
Артём Макаров

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 20.02.2017(UTC)
Сообщений: 217

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 62 раз в 58 постах
Автор: Андрей Врагов Перейти к цитате
Автор: Артём Макаров Перейти к цитате
Автор: Андрей Врагов Перейти к цитате
Коллеги из КриптоПро,
можете поподробнее просветить, для чего при установке CoreFx также копировать сборки NetStandard? Я так думал, что вы пропатчили сам CoreFx нашей криптографией, а по сему достаточно добавить только ссылки на сборки System.Security.Cryptography.Pkcs и System.Security.Cryptography.Xml. В чем смысл добавления сборок NetStandard причем не из самого CoreFx?


Вызвано особенностью инфраструктуры исходного проекта. Сборки Xml и Pkcs явно не зависят от сборок криптографии из рантйма, а зависят от нетстандарта, который является "прослойкой".

Т.е. если сборка xml желает воспользоваться криптографией она использует нужные классы из нетстандарта, который вызывает из уже из самого рантайма.

Так как мы изменили рантайм, добавив в него гостовые классы, про которые родной стандарт не знает - пришлось модифицировать и стандарт, дабы Xml и Pkcs могли ими пользоваться.

Сам код стандарта представляет из себя лишь "переброску" классов из рантайма, никокй дополнительной логики, кроме инфраструктурной, там нет. Сам проект стандарта содержит api классов и указание на сборки с реализациями этого api (т.е. ссылка на рантайм).

Артем, а можно более детально?
Насколько я понимаю в глубинах .Net, каждый проект имеет несколько типов зависимостей. Первый тип - зависимость от фреймворка, создается автоматически при указании типа проекта. Например, собственно Net Core - выполняет базовые вещи, Asp Net Core - поддержка Web проектов, WindowsDesktop - поддержка UI для десктопных проектов и т.п.
Каждый фреймворк содержит необходимый набор сборок. Кстати, мне непонятно, почему стандартно сборки System.Security.Cryptography.Pkcs и System.Security.Cryptography.Xml входят во фреймворк Asp Net Core, а не в базовый Net Core. Не по этой ли причине по вашей инструкции их необходимо добавлять в файле проекта?
Вторая зависимость это бинарные пакеты (nuget), которые де факто являются расширением функционала фреймворков.
Третья - это отдельные сборки. В нашем случае мы как раз таким образом указываем сборки Pkcs и Xml.
Четвертая - это другие проекты, включенные в solution.

Первый вопрос, в какой последовательности .Net осуществляет поиск сборок, с требуемыми классами? Поясню. Если, например, проект зависит от фреймворка Asp Net Core, а также в файле проекта отдельно прописаны сборки Pkcs и Xml, то откуда данные сборки будут браться для помещения в папку bin при компиляции проекта?
Второй вопрос. В моем тестовом приложении есть такой код:

Код:

var signerCert = SelectCertificate();
            var ci = new ContentInfo(new Oid(NativeConstants.szOID_PKCS_7_DATA), raw);

            var cms = new SignedCms(ci);

            var attr = new CryptographicAttributeObject(new Oid(NativeConstants.szOID_ENROLLMENT_NAME_VALUE_PAIR));
            var asn = new AsnEncodedData(TemplateEncoder.Encode(attrNVCertTemplate.pwszValue));
            attr.Values.Add(asn);

            if (signerCert != null)
            {

                var digestAlgorithm = new Oid(SelectDigestAlgorithmByCertificate(signerCert));
                var signer = new CmsSigner() { IncludeOption = X509IncludeOption.EndCertOnly, Certificate = signerCert, DigestAlgorithm = digestAlgorithm };
                signer.SignedAttributes.Add(attr);
                cms.ComputeSignature(signer, true);
                var cms2 = new SignedCms(new ContentInfo(new Oid(NativeConstants.szOID_PKCS_7_DATA), cms.Encode()));
                cms2.ComputeSignature(signer, true);


Проект настроен по образу и подобию с вашим тестовым проектом из CoreFx. Ошибка вылетает при вызове метода ComputeSignature. Что где посмотреть? Может я что-то пропустил?
Причем сначала все работало, но потом что-то случилось. Поэтому и пытаюсь понять детали в организации ваших патчей и прочего.



Pkcs и Xml сборки распространяются ms отдельно, в качестве nuget пакетов, зависят от рантайма, как я писал выше, через стандарт. Поэтому их приходится указывать отдельно от указания пакета с рантаймом.

Классы и сборки форка рантайма от обычных сборок никак не отличаются.

В проект они добавляются просто как ещё один нугет пакет (тот самый, который указывается в csproj, Microsoft.Private.CoreFx.NETCoreApp), с указанием, что в случае конфликтов используйте те, что указаны в данном нугет пакете (что делается указанием PackageConflictPreferredPackages). Т.е. фактически вы говорите компилятору - вот тебе ещё один пакет, в котором реализованы все классы из рантайма и бери их пожалуйста именно оттуда, а не из исходного рантайма. Никакой дополнительной логики поверх этого нет.

Также строго зависим от конкретной версии рантайма, ибо при несовпадении версий дотнет любит всё равно подкладывать сборки из исходного рантайма. Поэтому просим устанавливать именно указанные версии sdk и рантаймов.

Поиск сборок при исполнении тоже не обладает какими либо особенностями, выполняется обычный поиск сборок. Повторюсь - наш форк это просто пакет со сборками.

Отредактировано пользователем 29 сентября 2022 г. 13:41:27(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Врагов  
#267 Оставлено : 29 сентября 2022 г. 13:48:30(UTC)
Андрей Врагов

Статус: Участник

Группы: Участники
Зарегистрирован: 11.04.2017(UTC)
Сообщений: 25

Сказал(а) «Спасибо»: 1 раз
Детали ошибки:

Код:

Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException
  HResult=0x80090015
  Message=Неправильный открытый ключ поставщика.
  Source=System.Security.Cryptography.Pkcs
  StackTrace:
   at Internal.Cryptography.Pal.Windows.PkcsPalWindows.GetPrivateKey[T](X509Certificate2 certificate, Boolean silent, Boolean preferNCrypt) in C:\Projects\C#\corefx-master\src\System.Security.Cryptography.Pkcs\src\Internal\Cryptography\Pal\Windows\PkcsPalWindows.cs:line 212
   at Internal.Cryptography.Pal.Windows.PkcsPalWindows.GetPrivateKeyForSigning[T](X509Certificate2 certificate, Boolean silent) in C:\Projects\C#\corefx-master\src\System.Security.Cryptography.Pkcs\src\Internal\Cryptography\Pal\Windows\PkcsPalWindows.cs:line 181
   at System.Security.Cryptography.Pkcs.CmsSignature.Gost2012_256CmsSignature.Sign(ReadOnlySpan`1 dataHash, HashAlgorithmName hashAlgorithmName, X509Certificate2 certificate, AsymmetricAlgorithm key, Boolean silent, Oid& signatureAlgorithm, Byte[]& signatureValue) in C:\Projects\C#\corefx-master\src\System.Security.Cryptography.Pkcs\src\System\Security\Cryptography\Pkcs\CmsSignature.Gost2012_256.cs:line 71
   at System.Security.Cryptography.Pkcs.CmsSignature.Sign(ReadOnlySpan`1 dataHash, HashAlgorithmName hashAlgorithmName, X509Certificate2 certificate, AsymmetricAlgorithm key, Boolean silent, Oid& oid, ReadOnlyMemory`1& signatureValue) in C:\Projects\C#\corefx-master\src\System.Security.Cryptography.Pkcs\src\System\Security\Cryptography\Pkcs\CmsSignature.cs:line 104
   at System.Security.Cryptography.Pkcs.CmsSigner.Sign(ReadOnlyMemory`1 data, String contentTypeOid, Boolean silent, X509Certificate2Collection& chainCerts) in C:\Projects\C#\corefx-master\src\System.Security.Cryptography.Pkcs\src\System\Security\Cryptography\Pkcs\CmsSigner.cs:line 251
   at System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer, Boolean silent) in C:\Projects\C#\corefx-master\src\System.Security.Cryptography.Pkcs\src\System\Security\Cryptography\Pkcs\SignedCms.cs:line 323
   at CertificateRequest.CertificateRequest.Pkcs10ToPkcs7AddNVPAndSignMS(Byte[] raw) in C:\Projects\C#\Core\Sample\CertficateRequestDesktop\CertficateRequestDesktop\Program.cs:line 93
   at CertificateRequest.CertificateRequest.Main(String[] args) in C:\Projects\C#\Core\Sample\CertficateRequestDesktop\CertficateRequestDesktop\Program.cs:line 52

Offline Андрей Врагов  
#268 Оставлено : 29 сентября 2022 г. 13:54:50(UTC)
Андрей Врагов

Статус: Участник

Группы: Участники
Зарегистрирован: 11.04.2017(UTC)
Сообщений: 25

Сказал(а) «Спасибо»: 1 раз
Артем, да, я знаю, что .Net при сборке очень любит смотреть на версии пакетов.
Кстати, о конфликтах. Правильно ли я понимаю, что разрешение конфликтов с одинаковыми сборками надо указывать для всех проектов, где есть использование криптографии?
Offline Артём Макаров  
#269 Оставлено : 29 сентября 2022 г. 13:59:32(UTC)
Артём Макаров

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 20.02.2017(UTC)
Сообщений: 217

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 62 раз в 58 постах
Автор: Андрей Врагов Перейти к цитате
Артем, да, я знаю, что .Net при сборке очень любит смотреть на версии пакетов.
Кстати, о конфликтах. Правильно ли я понимаю, что разрешение конфликтов с одинаковыми сборками надо указывать для всех проектов, где есть использование криптографии?


Указывать надо для всех проектов, где вы явно собираетесь пользоваться модифицированными классами. Т.е. если вы указывается ссылку на модифицированный рантайм - указывайте и на способ разрешения конфликтов.

По ошибке - ошибка из csp, попробуйте поискать по форуму по текстовке или попробовать с другими сертификатами. Скорее всего что то не так с сертификатом\контейнером.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Врагов  
#270 Оставлено : 29 сентября 2022 г. 14:53:40(UTC)
Андрей Врагов

Статус: Участник

Группы: Участники
Зарегистрирован: 11.04.2017(UTC)
Сообщений: 25

Сказал(а) «Спасибо»: 1 раз
Автор: Артём Макаров Перейти к цитате

По ошибке - ошибка из csp, попробуйте поискать по форуму по текстовке или попробовать с другими сертификатами. Скорее всего что то не так с сертификатом\контейнером.


Да, все верно, Артем, ошибка приходит из Csp. Я с какого-то перепугу стали грешить на то, что .Net использует непропатченный код.
Я уже нашел причину, на контейнере был установлен пин-код.
Спасибо большое за помощь!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
36 Страницы«<2526272829>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.