C# 将证书和密钥(PFX)导入CNG/KSP

问题描述 投票:0回答:2

我正在尝试使用 KSP 来存储密钥,将证书/密钥 (PFX) 导入到 Windows 证书存储中。其背后的想法是能够使用自定义 KSP,即使现在我只是使用默认的 KSP。

使用 CNG 将密钥存储到 KSP 中是“简单”的部分,下面是适合我的代码:

X509Certificate2 cert = new X509Certificate2(@"c:\temp\test.pfx", "test123", X509KeyStorageFlags.Exportable);
RSACng rsaCNG = new RSACng();
rsaCNG.FromXmlString(cert.GetRSAPrivateKey().ToXmlString(true));
var keyData = rsaCNG.Key.Export(CngKeyBlobFormat.GenericPrivateBlob);
var keyParams = new CngKeyCreationParameters
{
    ExportPolicy = CngExportPolicies.None,
    KeyCreationOptions = CngKeyCreationOptions.MachineKey,
    Provider = CngProvider.MicrosoftSoftwareKeyStorageProvider
};
keyParams.Parameters.Add(new CngProperty(CngKeyBlobFormat.GenericPrivateBlob.Format, keyData, CngPropertyOptions.None));
var key = CngKey.Create(CngAlgorithm.Rsa, "testKey", keyParams);

但是,我无法将此密钥与证书关联,以便将证书正确存储到 Windows 存储中。代码如下:

rsaCNG = new RSACng(key);
X509Certificate2 certOnly = new X509Certificate2(cert.Export(X509ContentType.Cert));
certOnly.PrivateKey = rsaCNG;
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(certOnly);
store.Close();

失败,但有异常:

Only asymmetric keys that implement ICspAsymmetricAlgorithm are supported.
位于第
certOnly.PrivateKey = rsaCNG
行。

有人知道该怎么做吗?我正在使用 .NET Framework 4.6.2,并且希望尽可能避免 P/Invoke。如果有必要,我可以升级到 .NET Framework 4.7.X,尽管代码在 4.7.2 中引发了相同的错误。

c# windows certificate x509certificate pkcs#12
2个回答
0
投票

使用 4.7.2 中的

CopyWithPrivateKey
扩展方法,它可以理解 CAPI 和 CNG 密钥。

// certWithKey understands it has a persisted key reference if rsaCNG's key is
// a named key, so adding it to the store and reading it back will work.
X509Certificate2 certWithKey = certOnly.CopyWithPrivateKey(rsaCNG);
...
store.Add(certWithKey);
...

0
投票

更新:下面描述的问题已在最新的 Windows 11/Windows Server 2022 版本中修复。

原答案:

虽然 bartonjs 的答案适用于 Microsoft 软件密钥存储提供程序,但对于 Microsoft 平台密钥存储提供程序和计算机密钥却失败了,因为 PKI Guy 已经指出了 KSP 或 .NET 中的错误(导入的密钥) IsMachineKey 为 false)。

有一种解决方法适用于平台密钥存储提供程序,甚至适用于机器密钥:

https://github.com/glueckkanja-pki/TPMImport

© www.soinside.com 2019 - 2024. All rights reserved.