【发布时间】:2019-01-02 11:24:51
【问题描述】:
我正在尝试将证书/密钥 (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