我正在阅读X509Store的证书,我想让它使用CngKey GetCngPrivateKey。但我得到的只是以下错误。
at Security.Cryptography.X509Certificates.X509Native.AcquireCngPrivateKey(SafeCertContextHandle certificateContext)\ r \ n在Security.Cryptography.X509Certificates.X509Certificate2ExtensionMethods.GetCngPrivateKey(X509Certificate2 certificate)\ r \ n
证书正在通过验证HasCngKey,但我无法获得其值。有没有其他方法可以获得CngKey?
byte[] digest = null;
using (var hmac = SHA256.Create())
{
digest = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(data));
}
var certificate = collection[0];
byte[] firmadigital = null;
CngKey privateKey = null;
AsymmetricAlgorithm privateKey1 = null;
var hasCng = certificate.HasCngKey();
if (hasCng)
{
privateKey = certificate.GetCngPrivateKey();
Console.WriteLine("tiene CNG");
var key = new Security.Cryptography.RSACng(privateKey);
key.SignatureHashAlgorithm = CngAlgorithm.Sha1;
var p = key.SignData(digest);
return Convert.ToBase64String(p);
}
我正在使用c#net core 2.0
由于
答案 0 :(得分:4)
您似乎正在使用额外的库,因为.NET Framework和.NET Core都没有HasCngKey
,GetCngPrivateKey()
或基于属性的RSACng
类。我猜你正在使用clrsecurity
CodePlex原型中的加密库。
您使用的功能是在.NET Framework(从4.6开始)和.NET Core(所有版本)中,但名称不同。
而不是
var hasCng = certificate.HasCngKey();
if (hasCng)
{
privateKey = certificate.GetCngPrivateKey();
Console.WriteLine("tiene CNG");
var key = new Security.Cryptography.RSACng(privateKey);
key.SignatureHashAlgorithm = CngAlgorithm.Sha1;
var p = key.SignData(digest);
return Convert.ToBase64String(p);
}
你想要
using (RSA rsa = certificate.GetRSAPrivateKey())
{
Console.WriteLine("tiene RSA. Que tipo no es importante.");
var p = rsa.SignData(digest, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
return Convert.ToBase64String(p);
}
正确将对象从GetRSAPrivateKey()
放入使用块,因为该方法每次调用都会返回一个不同的对象。
选择GetRSAPrivateKey()
的原因(以及修复RSA基类更有用)是因为相同的代码适用于Windows CNG,Windows CAPI,Linux和macOS。检查返回对象并进一步强制转换的唯一原因是使用OS / cryptolib进行基于指针的互操作。 (但由于Windows可以根据需要返回CNG或CAPI,因此很难达到正确的程度)