Статус: Сотрудник
Группы: Участники
Зарегистрирован: 20.02.2017(UTC) Сообщений: 216
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 62 раз в 58 постах
|
Автор: Dmitriy_Zh Добрый день! Коллеги, пытаемся использовать LibCore для подписания данных. Наш стенд: redos 7.3 CSP (Type:80) v5.0.10011 KC1 Release Ver:5.0.12600 OS:Linux CPU:AMD64 FastCode:READY:AVX. DISABLED:RSA; Версия библиотеки: LibCore.Linux 2023.1.11.1 Сертификат: Тестовый сертификат Крипто про УЦ (сгенерированный через утилиту) Метод подписи: Код:
using var currentUserStore = new CpX509Store(StoreLocation.CurrentUser);
currentUserStore.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509Certificate2Collection found = currentUserStore.Certificates.Find(X509FindType.FindBySerialNumber,
prepearedSerialNumber, false);
var contentInfo = new ContentInfo(data);
var signedCms = new SignedCms(contentInfo, detached);
var cmsSigner = new CmsSigner(found[0]) {IncludeOption = X509IncludeOption.EndCertOnly};
signedCms.ComputeSignature(cmsSigner, false);
В итоге получаем вот такую ошибку: Код:LibCore.Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Cryptography error
at LibCore.Internal.NativeCrypto.CapiHelper.SignValue(SafeProvHandle hProv, SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte[] hash)
at LibCore.Security.Cryptography.Gost3410_2012_256CryptoServiceProvider.SignHash(Byte[] rgbHash)
at LibCore.Security.Cryptography.Gost3410_2012_256CryptoServiceProvider.SignHash(Byte[] rgbHash, HashAlgorithmName hashAlgName)
at LibCore.Security.Cryptography.Gost3410_2012_256.TrySignHash(ReadOnlySpan`1 hash, Span`1 destination, HashAlgorithmName hashAlgorithm, Int32& bytesWritten)
at LibCore.Security.Cryptography.GostCmsSignature.Gost2012_256CmsSignature.Sign(ReadOnlySpan`1 dataHash, HashAlgorithmName hashAlgorithmName, X509Certificate2 certificate, AsymmetricAlgorithm key, Boolean silent, String& signatureAlgorithm, Byte[]& signatureValue)
at LibCore.Security.Cryptography.GostCmsSignature.Sign(ReadOnlySpan`1 dataHash, HashAlgorithmName hashAlgorithmName, X509Certificate2 certificate, AsymmetricAlgorithm key, Boolean silent, String& oid, ReadOnlyMemory`1& signatureValue)
at LibCore.Security.Cryptography.Pkcs.Detours.CmsSignerDetour.Prefix(ReadOnlyMemory`1 data, String contentTypeOid, Boolean silent, X509Certificate2Collection& chainCerts, CmsSigner __instance, Object& __result)
at System.Security.Cryptography.Pkcs.CmsSigner.Sign_Patch1(CmsSigner this, IntPtr retbuf, ReadOnlyMemory`1 data, String contentTypeOid, Boolean silent, X509Certificate2Collection& chainCerts)
at System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer, Boolean silent)
Подскажите пожалуйста, в какую сторону копать. Спасибо :) Добрый день. С большой вероятностью что то не так с контейнером ключа. Среди возможных причин - истечение срока действия закрытого ключа, отсутствие прав на контейнер для пользователя, неверный тип ключа. Начать лучше с проверки контейнера. Можно посмотреть на свойство HResult у возникающего исключения. Там должен быть код ошибки от csp. Падает именно на методе SignHash, т.е. проблема не в Cms, а именно в ключе. Для тестов можно попробовать позвать данный метод у закрытого ключа сертификата. Для госта 2012 256: Код:var key = found[0].GetGost3410_2012_256PrivateKey();
key.SignHash(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7 });
На проблемном контейнере ошибку будет и в данном коде. |