如何在不使用网络核心2.0中的GetCngPrivateKey的情况下获取CngKey

时间:2018-03-16 00:09:59

标签: c# cryptography asp.net-core-2.0 cng

我正在阅读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

由于

1 个答案:

答案 0 :(得分:4)

您似乎正在使用额外的库,因为.NET Framework和.NET Core都没有HasCngKeyGetCngPrivateKey()或基于属性的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,因此很难达到正确的程度)