Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,391 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 715 раз в 620 постах
|
Приложению не хватает прав на доступ к контейнеру? Нужны права на запись. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,391 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 715 раз в 620 постах
|
То есть вы используете сертификат из хранилища компьютера, а контейнер пользователя? Очень странная конфигурация, лучше так не делать. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 21.08.2020(UTC) Сообщений: 8 Сказал(а) «Спасибо»: 3 раз
|
Автор: Максим Коллегин То есть вы используете сертификат из хранилища компьютера, а контейнер пользователя? Очень странная конфигурация, лучше так не делать. И сертификат в хранилище компьютера и контейнер компьютерный. CP.PNG (32kb) загружен 12 раз(а).
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 20.02.2017(UTC) Сообщений: 216
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 62 раз в 58 постах
|
Автор: 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 раз(а).. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 21.08.2020(UTC) Сообщений: 8 Сказал(а) «Спасибо»: 3 раз
|
Цитата:Получен закрытый ключ, произведена CMS подпись. У меня сертификат подписан алгоритмом GOST R 34.11-2012 256 bit. А вы не могли бы прикрепить весь тестовый проект c bin папкой?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 20.02.2017(UTC) Сообщений: 216
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 62 раз в 58 постах
|
Автор: 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 на используемую вами. |
|
1 пользователь поблагодарил Артём Макаров за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 21.08.2020(UTC) Сообщений: 8 Сказал(а) «Спасибо»: 3 раз
|
Цитата:Собрал пример, форум не даёт прикрепить большой архив, ссылка на облако Просит пароль на архив.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 20.02.2017(UTC) Сообщений: 216
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 62 раз в 58 постах
|
Автор: LFrolov Цитата:Собрал пример, форум не даёт прикрепить большой архив, ссылка на облако Просит пароль на архив. Пароль - 1 |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close