如何在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 都没有 HasCngKey
、GetCngPrivateKey()
或 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,因此很难做到这一点)
我正在从 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 都没有 HasCngKey
、GetCngPrivateKey()
或 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,因此很难做到这一点)