我正在尝试将证书/密钥(PFX)导入Windows证书存储,使用KSP存储密钥。这背后的想法是能够使用自定义的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();失败并出现异常:certOnly.PrivateKey = rsaCNG行的Only asymmetric keys that implement ICspAsymmetricAlgorithm are supported.。
有谁知道怎么做对吗?我使用的是.NET框架4.6.2,如果可能的话,我希望避免使用P/Invoke。如果需要,我可以升级到.NET框架4.7.X,尽管4.7.2中的代码会引发相同的错误。
发布于 2018-07-27 23:59:43
使用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);
...发布于 2020-12-09 03:36:43
虽然bartonjs的答案适用于微软软件密钥存储提供商,但对于微软平台密钥存储提供商和机器密钥,由于PKI Guy已经指出的a bug in the KSP or .NET (导入的密钥具有IsMachineKey false),它失败了。
有一种解决方法适用于平台密钥存储提供商,甚至适用于机器密钥:https://github.com/glueckkanja-pki/TPMImport
https://stackoverflow.com/questions/51522330
复制相似问题