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

Уведомление

Icon
Error

36 Страницы«<2728293031>»
Опции
К последнему сообщению К первому непрочитанному
Offline AndreyES  
#281 Оставлено : 11 октября 2022 г. 15:41:35(UTC)
AndreyES

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

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

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 2 раз в 2 постах
Автор: Michal Перейти к цитате
Автор: AndreyES Перейти к цитате
Автор: Michal Перейти к цитате
Автор: AndreyES Перейти к цитате
Автор: Michal Перейти к цитате
Автор: AndreyES Перейти к цитате
Автор: Michal Перейти к цитате
Hi everyone.

I am interested in this scenario:

Цитата:
use CryptoPro CSP via p/invoke - use unmanaged code, MS CryptoAPI 2.0.


I would like to understand which dll should be invoked here. Do you have a COM library that could be imported to .NET application ?
My use-case scenario is that we have to integrate with an API that use CryptoPro CSP to sign and verify the data. So the flow of the application is that user gives us his private certificate, we then have to "sign" the data with this certificate and then pass to the external API.
Basically we have to perform the same signature that is done on the sample page https://www.cryptopro.ru...ge/cades_bes_sample.html

I would be really grateful if someone can point me to the right direction here.

Regards,
Michal


Hi, if you need to sign data on the server side, what version of .NET is used?


I am using .NET 5.0


If your target OS is Windows you should create a managed wrapper around crypt32.dll using p/invoke, on Linux CryptoPro created Capilite library, which is similar to Windows cryptoAPI, so you need to create a wrapper around this library. For crypt32.dll function signature definition you can use https://www.pinvoke.net/ site. YOu can find Capilite signature definition in CryptoPro SDK.



I am targeting Windows, I know how to use p/invoke, in fact we are already using it in similar solution for Kazakhstan, but they use KalkanCrypt instead of CryptoPro. Where can I get crypt32.dll from ?


It's a system Windows library


Oh I see. I thought you already have some sort of wrapper I can use to simply sign the data. Is there any documentation that will help me to replicate what is being done on this sample page https://www.cryptopro.ru...ge/cades_bes_sample.html ?


This sample using client-side signing with cades bes signature, you can inspect code in developer tools. You can find samples and other docs here: https://cpdn.cryptopro.ru/
Offline Michal  
#282 Оставлено : 11 октября 2022 г. 18:43:34(UTC)
Michal

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

Группы: Участники
Зарегистрирован: 11.10.2022(UTC)
Сообщений: 7
Польша

Is there a guide explaining how to replicate this using Crypto Pro installed on the machine ?
Basically I have installed recent Crypto PRO CSP. It comes with 2 exe files certmgr.exe and csptest.exe - I would like to know which commands with what parameters should I call it ( i suppose csptest.exe ) to receive the same signature as I do on the demo website ( https://www.cryptopro.ru...ge/cades_bes_sample.html )

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

Offline Michal  
#283 Оставлено : 13 октября 2022 г. 11:45:59(UTC)
Michal

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

Группы: Участники
Зарегистрирован: 11.10.2022(UTC)
Сообщений: 7
Польша

Автор: AndreyES Перейти к цитате
Автор: Michal Перейти к цитате
Автор: AndreyES Перейти к цитате
Автор: Michal Перейти к цитате
Автор: AndreyES Перейти к цитате
Автор: Michal Перейти к цитате
Автор: AndreyES Перейти к цитате
Автор: Michal Перейти к цитате
Hi everyone.

I am interested in this scenario:

Цитата:
use CryptoPro CSP via p/invoke - use unmanaged code, MS CryptoAPI 2.0.


I would like to understand which dll should be invoked here. Do you have a COM library that could be imported to .NET application ?
My use-case scenario is that we have to integrate with an API that use CryptoPro CSP to sign and verify the data. So the flow of the application is that user gives us his private certificate, we then have to "sign" the data with this certificate and then pass to the external API.
Basically we have to perform the same signature that is done on the sample page https://www.cryptopro.ru...ge/cades_bes_sample.html

I would be really grateful if someone can point me to the right direction here.

Regards,
Michal


Hi, if you need to sign data on the server side, what version of .NET is used?


I am using .NET 5.0


If your target OS is Windows you should create a managed wrapper around crypt32.dll using p/invoke, on Linux CryptoPro created Capilite library, which is similar to Windows cryptoAPI, so you need to create a wrapper around this library. For crypt32.dll function signature definition you can use https://www.pinvoke.net/ site. YOu can find Capilite signature definition in CryptoPro SDK.



I am targeting Windows, I know how to use p/invoke, in fact we are already using it in similar solution for Kazakhstan, but they use KalkanCrypt instead of CryptoPro. Where can I get crypt32.dll from ?


It's a system Windows library


Oh I see. I thought you already have some sort of wrapper I can use to simply sign the data. Is there any documentation that will help me to replicate what is being done on this sample page https://www.cryptopro.ru...ge/cades_bes_sample.html ?


This sample using client-side signing with cades bes signature, you can inspect code in developer tools. You can find samples and other docs here: https://cpdn.cryptopro.ru/


Thank you for your help. I have managed to go a bit further with that. I have used the COM interface ( https://docs.cryptopro.ru/cades/reference/cadescom ) and tried to sign the data like in the example ( https://docs.cryptopro.r...s/cadescomsamplesigndata ) but it fails on the last step with following error:
"System.Runtime.InteropServices.COMException: 'A certificate chain could not be built to a trusted root authority.'"

I have installed the certificate to the trusted root authority ( and as mentioned before it works when using CryptoPRO EDS Browser plugin ). Any ideas how to solve this ?

VS_Screenshot
Offline emejibka  
#284 Оставлено : 13 октября 2022 г. 15:27:42(UTC)
emejibka

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

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

Сказал(а) «Спасибо»: 2 раз
Здравствуйте, коллеги.

При попытке посчитать подпись получаем ошибку
Код:

Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Cryptography error
   at Internal.NativeCrypto.CapiHelper.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
   at System.Security.Cryptography.Gost3410_2012_256CryptoServiceProvider.get_SafeProvHandle()
   at System.Security.Cryptography.Gost3410_2012_256CryptoServiceProvider.get_SafeKeyHandle()
   at System.Security.Cryptography.Gost3410_2012_256CryptoServiceProvider.GetKeyPair()
   at System.Security.Cryptography.Gost3410_2012_256CryptoServiceProvider..ctor(CspParameters parameters)
   at Internal.Cryptography.Pal.Windows.PkcsPalWindows.GetPrivateKey[T](X509Certificate2 certificate, Boolean silent, Boolean preferNCrypt)
   at Internal.Cryptography.Pal.Windows.PkcsPalWindows.GetPrivateKeyForSigning[T](X509Certificate2 certificate, Boolean silent)
   at System.Security.Cryptography.Pkcs.CmsSignature.Gost2012_256CmsSignature.Sign(ReadOnlySpan`1 dataHash, HashAlgorithmName hashAlgorithmName, X509Certificate2 certificate, AsymmetricAlgorithm key, Boolean silent, Oid& signatureAlgorithm, Byte[]& signatureValue)
   at System.Security.Cryptography.Pkcs.CmsSignature.Sign(ReadOnlySpan`1 dataHash, HashAlgorithmName hashAlgorithmName, X509Certificate2 certificate, AsymmetricAlgorithm key, Boolean silent, Oid& oid, ReadOnlyMemory`1& signatureValue)
   at System.Security.Cryptography.Pkcs.CmsSigner.Sign(ReadOnlyMemory`1 data, String contentTypeOid, Boolean silent, X509Certificate2Collection& chainCerts)
   at System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer, Boolean silent)
   at MedInfoCenter.CryptoApi.Controllers.DetachedSignatureController.ComputeSignature(ComputeSignatureRequest computeSignatureRequest, String thumbprint) in 
...


Ошибка плавающая, зависит от того каким сертификатом пользуются, на одних сертификатах не воспроизводится никогда, на других - всегда воспроизводится. Сертификаты устанавливаются одним и тем же способом: на машине пользователя делаем экспорт в pfx, на сервере устанавливаем командой certmgr -install -pfx -file путь к файлу -silent -pin

подпись считаем следующим образом:
Код:

            using (var gostCert = _certificateRepository.FindCertificate(thumbprint))
            {
                if (gostCert == null)
                {
                    return BadRequest("Сертификат не найден");
                }

                using (var currentUserStore = new X509Store(StoreLocation.CurrentUser))
                {
                    currentUserStore.Open(OpenFlags.ReadOnly);
                    var contentInfo = new ContentInfo(rawData);
                    var signedCms = new SignedCms(contentInfo, true);
                    var cmsSigner = new CmsSigner(gostCert);
                    signedCms.ComputeSignature(cmsSigner, true);

                    return Ok(new { Signature = signedCms.Encode() });
                }
            }


метод FindCertificate
Код:

public X509Certificate2 FindCertificate(string thumbprint)
        {
            if (thumbprint == null) throw new ArgumentNullException(nameof(thumbprint));

            var sanitizedThumbprint = new string(thumbprint.Where(char.IsLetterOrDigit).Select(char.ToUpper).ToArray());

            using (var currentUserStore = new X509Store(StoreLocation.CurrentUser))
            {
                currentUserStore.Open(OpenFlags.ReadOnly);

                return currentUserStore.Certificates
                                       .OfType<X509Certificate2>()
                                       .SingleOrDefault(x => x.Thumbprint == sanitizedThumbprint);
            }
        }


Воспроизвести не получается, ни на одном из тестовых сертификатов ошибка не воспроизводится.

Приложение запущено в docker, права на папки /var/opt/cprocsp/keys и /var/opt/cprocsp/users у пользователя есть (и чтение и запись).

Что может приводить к ошибке?
Offline emejibka  
#285 Оставлено : 17 октября 2022 г. 11:31:03(UTC)
emejibka

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

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

Сказал(а) «Спасибо»: 2 раз
заменил создание экземпляра CmsSigner на
Код:
var cmsSigner = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, gostCert, gostCert.PrivateKey);

и ошибка пропала.
Offline Андрей Врагов  
#286 Оставлено : 17 октября 2022 г. 17:39:33(UTC)
Андрей Врагов

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

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

Сказал(а) «Спасибо»: 1 раз
Добрый день!

Коллеги из КриптоПро, подскажите, пожалуйста, ранее в КриптоПро .NET при создании симметричного ключа:
Код:

           var symmetric = new CryptoPro.Sharpei.Gost28147CryptoServiceProvider();

           symmetric.GenerateKey();
            


ключ создавался без проблем.
Сейчас же генерация приводит к пустому значению KeyValue.
В CoreFx в классе Gost28147CryptoServiceProvider обнаружил интересную конструкцию:
Код:

        public override void GenerateKey()
        {
            CapiHelper.GenerateKey(SafeProvHandle,
                GostConstants.CALG_G28147, CspProviderFlags.NoFlags,
                GostConstants.G28147_KEYLEN * BitsPerByte, out _safeKeyHandle);
            KeyValue = null;
            KeySizeValue = GostConstants.G28147_KEYLEN * BitsPerByte;
        }


Не могли бы вы прокомментировать эту конструкцию?
Offline Артём Макаров  
#287 Оставлено : 18 октября 2022 г. 7:45:46(UTC)
Артём Макаров

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 62 раз в 58 постах
Автор: Андрей Врагов Перейти к цитате
Добрый день!

Коллеги из КриптоПро, подскажите, пожалуйста, ранее в КриптоПро .NET при создании симметричного ключа:
Код:

           var symmetric = new CryptoPro.Sharpei.Gost28147CryptoServiceProvider();

           symmetric.GenerateKey();
            


ключ создавался без проблем.
Сейчас же генерация приводит к пустому значению KeyValue.
В CoreFx в классе Gost28147CryptoServiceProvider обнаружил интересную конструкцию:
Код:

        public override void GenerateKey()
        {
            CapiHelper.GenerateKey(SafeProvHandle,
                GostConstants.CALG_G28147, CspProviderFlags.NoFlags,
                GostConstants.G28147_KEYLEN * BitsPerByte, out _safeKeyHandle);
            KeyValue = null;
            KeySizeValue = GostConstants.G28147_KEYLEN * BitsPerByte;
        }


Не могли бы вы прокомментировать эту конструкцию?



1. Явный вызов GenerateKey можно опустить - в рамках работы конструктора явно создаётся ключ и прописывается хэндл на него. При вызове GenerateKey ключ будет сгенерирован снова и будет прописан новый хэндл.

2. Логика по сравнению с КриптоПро.NET не изменилась. Поле KeyValue имеет тип byte[] и ожидается, что именно туда будет помещён сырой ключ. Так как мы не работаем с сырыми ключами и не позволяем экспортировать и задавать ключ в сыром виде - данное поле никогда не заполняется и имеется значение Null. Вся работа с ключом происходит через его хэндл. Если нужно посмотреть на признак наличия ключа ключа - смотрите на поле SafeKeyHandle.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Врагов  
#288 Оставлено : 21 октября 2022 г. 13:07:34(UTC)
Андрей Врагов

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

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

Сказал(а) «Спасибо»: 1 раз
Добрый день!

Хочу реализовать удаленный терминал без использования долгосрочных ключей на базе эфимерных ключей.
При вызове конструктора Gost3410_2012_256EphemeralCryptoServiceProvider без параметров получаю ошибку "SafeHandle cannot be null"
Получается, что можно вызвать конструктор только с параметрами.
И еще вопрос, как в таком случае я могу создать временные (не долговременные) ассиметричные ключи по заданному алгоритму ГОСТа и создать крипто провайдер без сохранения ключей в контейнере? Или эфимерные ключи как и долговременные так или иначе все равно сохраняются в контейнере, который удаляется при удалении объекта криптопровайдера?
Offline Андрей Врагов  
#289 Оставлено : 21 октября 2022 г. 13:39:49(UTC)
Андрей Врагов

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

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

Сказал(а) «Спасибо»: 1 раз
Все, отбой, сделал. Передал параметры открытого ключа через Gost3410Parameters, а потом через ExportParameters(false).PublicKey получил сам ключ.

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

Offline Андрей Врагов  
#290 Оставлено : 21 октября 2022 г. 15:01:38(UTC)
Андрей Врагов

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

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

Сказал(а) «Спасибо»: 1 раз
Коллеги из КриптоПро,

вот такая конструкция дает ошибку "Value was invalid":

Код:

           _gostParamSet.DigestParamSet = "1.2.643.7.1.1.2.2";
            _gostParamSet.PublicKeyParamSet = "1.2.643.2.2.36.0";

            Gost3410_2012_256EphemeralCryptoServiceProvider sender = new Gost3410_2012_256EphemeralCryptoServiceProvider(_gostParamSet);
            var exportedParameters = sender.ExportParameters(true);


При этом с параметром false все работает, но приватный ключ тогда получить нельзя. Отсюда вопрос, можно ли с помощью этого класса сгенерировать временные (не долгосрочные) ключи и без использования контейнера. Насколько я понимаю, этот класс должен создавать именно временные ключи, которые после удаления объекта также должны удаляться
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
36 Страницы«<2728293031>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.