如何在net core 2.0中不使用GetCngPrivateKey获取CngKey

How to get CngKey without using GetCngPrivateKey in net core 2.0

我正在从 X509Store 读取证书,我想使用它获取 CngKey 获取CngPrivateKey。但我得到的只是以下错误。

在 Security.Cryptography.X509Certificates.X509Native.AcquireCngPrivateKey(SafeCertContextHandle certificateContext)\r\n 在 Security.Cryptography.X509Certificates.X509Certificate2ExtensionMethods.GetCngPrivateKey(X509Certificate2 证书)\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

谢谢

您似乎在使用额外的库,因为 .NET Framework 和 .NET Core 都没有 HasCngKeyGetCngPrivateKey() 或 property-based RSACng class。我猜您正在使用 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() 中的对象放入 using 块中 是正确的,因为方法 return 每次调用都是一个不同的对象。

选择 GetRSAPrivateKey() 的原因(以及修复 RSA 基础 class 使其更有用)是因为相同的代码适用于 Windows CNG,Windows CAPI、Linux 和 macOS。检查 returned 对象并进一步转换的唯一原因是 pointer-based 与 OS/cryptolib 互操作。 (但由于 Windows 可以根据需要 return CNG 或 CAPI,因此很难做到这一点)