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

Уведомление

Icon
Error

35 Страницы«<1718192021>»
Опции
К последнему сообщению К первому непрочитанному
Offline LFrolov  
#181 Оставлено : 6 декабря 2021 г. 19:28:51(UTC)
LFrolov

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

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

Сказал(а) «Спасибо»: 3 раз
Подскажите, пожайлуста, в чем может быть проблема с CMS подписью:

Код:

  public static string SignData(byte[] data, X509Certificate2 certificate)
        {
            ContentInfo contentInfo = new ContentInfo(data);
            SignedCms signedCms = new SignedCms(contentInfo, false);

            CmsSigner cmsSigner = new CmsSigner(certificate);
            cmsSigner.IncludeOption = X509IncludeOption.EndCertOnly;

            signedCms.ComputeSignature(cmsSigner);

            byte[] msgBytes = signedCms.Encode();
            return Convert.ToBase64String(msgBytes, Base64FormattingOptions.InsertLineBreaks);
        }


Выдается исключение:
Код:

Unhandled exception. Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Keyset does not exist
   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) in C:\projects\corefx\src\System.Security.Cryptography.Pkcs\src\Internal\Cryptography\Pal\Windows\PkcsPalWindows.cs:line 285
   at Internal.Cryptography.Pal.Windows.PkcsPalWindows.GetPrivateKeyForSigning[T](X509Certificate2 certificate, Boolean silent) in C:\projects\corefx\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\corefx\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\corefx\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\corefx\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\corefx\src\System.Security.Cryptography.Pkcs\src\System\Security\Cryptography\Pkcs\SignedCms.cs:line 323
   at System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer) in C:\projects\corefx\src\System.Security.Cryptography.Pkcs\src\System\Security\Cryptography\Pkcs\SignedCms.cs:line 274
   at DotnetSample.Program.SignData(Byte[] data, X509Certificate2 certificate) in D:\Projects\CryptoPro\DotnetCoreSampleProject\Program.cs:line 300
   at DotnetSample.Program.Main(String[] args) in D:\Projects\CryptoPro\DotnetCoreSampleProject\Program.cs:line 81


Xml подпись работает. Сертификат в хранилище Local Computer. Permission'ы на Private key даны.
С сертификатами установленными в польльзовательское хранилище работает, с сертификатам установленными в хранилище компьютера - вызывается исключение.

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

Offline Максим Коллегин  
#182 Оставлено : 7 декабря 2021 г. 12:22:52(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,374
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
Приложению не хватает прав на доступ к контейнеру? Нужны права на запись.
Знания в базе знаний, поддержка в техподдержке
Offline LFrolov  
#183 Оставлено : 9 декабря 2021 г. 17:33:42(UTC)
LFrolov

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

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

Сказал(а) «Спасибо»: 3 раз
Цитата:
Приложению не хватает прав на доступ к контейнеру? Нужны права на запись.


Все таки кажется дело не в правах.


PkcsPalWindows.GetPrivateKey:

Код:

// The key handle is for CAPI.
                // Our CAPI types don't allow usage from a handle, so we have a few choices:
                // 1) Extract the information we need to re-open the key handle.
                // 2) Re-implement {R|D}SACryptoServiceProvider
                // 3) PNSE.
                // 4) Defer to cert.Get{R|D}SAPrivateKey if not silent, throw otherwise.
                CspParameters cspParams;

                try
                {
                    cspParams = handle.GetProvParameters();
                }


Возвращает:
Код:
cspParams: {"Flags":"UseExistingKey","KeyPassword":null,"ParentWindowHandle":{}}


А в конструкторе Gost3410_2012_256CryptoServiceProvider явно указано, что должен быть установлен флаг CspProviderFlags.UseMachineKeyStore:
Код:

/// <summary>
        /// Конструктор алгоритма подписи по ГОСТ Р 34.10-2012 256.
        /// </summary>
        /// 
        /// <param name="parameters">Параметры алгоритма.</param>
        /// 
        /// <remarks><para>При создании контейнера без заданного имени
        /// контейнера и без указания флага использования контейнера по 
        /// умолчанию будет создано случайное имя, а создание ключей
        /// будет отложено, до его первого обращения.
        /// </para>
        /// 
        /// <para>При инициализации объекта через данный конструктор 
        /// будут использованы именно эти параметры, в независимости от
        /// флага <see cref="UseMachineKeyStore"/>. По умолчанию значение
        /// флага из 
        /// <see cref="Gost3410_2012_256CryptoServiceProvider(CspParameters)"/>
        /// устанавливется в использование ключей из хранилищи пользователя.
        /// Для использования ключей из хранилища компьютера 
        /// необходимо установить флаг <see cref="CspParameters.Flags"/>:
        /// <see cref="CspProviderFlags.UseMachineKeyStore"/>.
        /// </para>
        /// </remarks>
        /// 
        /// <containerperm flag="Open">Для открытия существующего 
        /// контейнера.</containerperm>
        /// <containerperm flag="Create">Для создания контейнера с заданным
        /// (не случайным именем).</containerperm>
        [SecuritySafeCritical]
        public Gost3410_2012_256CryptoServiceProvider(CspParameters parameters)


Если флаг туда явно добавить, то по signedCms.ComputeSignature успешно отрабатывает.

Код:

cspParams.Flags |= CspProviderFlags.UseMachineKeyStore;


Может быть добавить UseMachineKeyStore как параметр, так же как silent?

Отредактировано пользователем 9 декабря 2021 г. 17:51:56(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#184 Оставлено : 9 декабря 2021 г. 17:36:51(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,374
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
То есть вы используете сертификат из хранилища компьютера, а контейнер пользователя? Очень странная конфигурация, лучше так не делать.
Знания в базе знаний, поддержка в техподдержке
Offline LFrolov  
#185 Оставлено : 9 декабря 2021 г. 17:56:16(UTC)
LFrolov

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

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

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


И сертификат в хранилище компьютера и контейнер компьютерный.

CP.PNG (32kb) загружен 12 раз(а).
Offline Артём Макаров  
#186 Оставлено : 13 декабря 2021 г. 8:34:06(UTC)
Артём Макаров

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 54 раз в 53 постах
Автор: LFrolov Перейти к цитате
Автор: Максим Коллегин Перейти к цитате
То есть вы используете сертификат из хранилища компьютера, а контейнер пользователя? Очень странная конфигурация, лучше так не делать.


И сертификат в хранилище компьютера и контейнер компьютерный.

CP.PNG (32kb) загружен 12 раз(а).


Воспроизвести пока не удалось.

Сертификат и контейнер в хранилище контейнера, получен через x509Store. Получен закрытый ключ, произведена CMS подпись.

Код:
 using (var store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
            {
                store.Open(OpenFlags.ReadOnly);
                var certG = store.Certificates.Find(X509FindType.FindBySubjectName, "CliServ 2001 256", false)[0];

                var gost1 = (Gost3410)certG.PrivateKey;

                ContentInfo contentInfo1 = new ContentInfo(new byte[] { 0 });
                SignedCms signedCms = new SignedCms(contentInfo1, false);

                CmsSigner cmsSigner = new CmsSigner(certG);
                cmsSigner.IncludeOption = X509IncludeOption.EndCertOnly;

                var signature = signedCms.ComputeSignature(cmsSigner);
}


Флаг UseMachineKeyStore в параметры контейнера попадает корректно (вложение)

Snimok.PNG (13kb) загружен 10 раз(а)..
Техническую поддержку оказываем тут
Наша база знаний
Offline LFrolov  
#187 Оставлено : 15 декабря 2021 г. 11:48:13(UTC)
LFrolov

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

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

Сказал(а) «Спасибо»: 3 раз
Цитата:
Получен закрытый ключ, произведена CMS подпись.

У меня сертификат подписан алгоритмом GOST R 34.11-2012 256 bit.

А вы не могли бы прикрепить весь тестовый проект c bin папкой?
Offline Артём Макаров  
#188 Оставлено : 15 декабря 2021 г. 12:17:14(UTC)
Артём Макаров

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 54 раз в 53 постах
Автор: LFrolov Перейти к цитате
Цитата:
Получен закрытый ключ, произведена CMS подпись.

У меня сертификат подписан алгоритмом GOST R 34.11-2012 256 bit.

А вы не могли бы прикрепить весь тестовый проект c bin папкой?


34.11-2012 256 определяет алгоритм хэширования, не подписи. Предположу, что речь идёт о том, что в качестве алгоритма ключа сертификата используется 34.10-2012 256.

Собрал пример, форум не даёт прикрепить большой архив, ссылка на облако - https://drive.google.com...gusRKMb/view?usp=sharing

Пример создаёт cms подпись на основе сертификата, загруженного из хранилища my-localmachine.

Поиск сертификата происходит по имени, сам сертификат не включен в архив, необходимо заменить на ваш.

Контейнер ключа, соответствующий сертификату, должен быть установлен в хранилище компьютера + выданы права на закрытый ключ (https://support.cryptopro.ru/index.php?/Knowledgebase/Article/View/112/14/ispolzovnie-sekretnykh-kljuchejj-v-sluzhbkh-windows-iis-etc).

Для сборки на вашей машине, возможно, понадобится изменить версию Microsoft.Private.CoreFx.NETCoreApp в csproj на используемую вами.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Артём Макаров за этот пост.
LFrolov оставлено 16.12.2021(UTC)
Offline LFrolov  
#189 Оставлено : 16 декабря 2021 г. 15:30:51(UTC)
LFrolov

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

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

Сказал(а) «Спасибо»: 3 раз
Цитата:
Собрал пример, форум не даёт прикрепить большой архив, ссылка на облако


Просит пароль на архив.
Offline Артём Макаров  
#190 Оставлено : 16 декабря 2021 г. 15:32:13(UTC)
Артём Макаров

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 54 раз в 53 постах
Автор: LFrolov Перейти к цитате
Цитата:
Собрал пример, форум не даёт прикрепить большой архив, ссылка на облако


Просит пароль на архив.


Пароль - 1
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
35 Страницы«<1718192021>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.