在成功地将 ECC 私钥附加到我从 PKI 中检索到的 X509Certificate2 之后(主要遵循这个 SO 问题的答案),我需要在没有 P/Invoke 的情况下执行此操作。
所以我尝试像这样使用 bouncycastle 附加密钥:
var pkcs12Store = new Pkcs12Store();
var certEntry = new X509CertificateEntry(bouncyCastleCertificate);
pkcs12Store.SetKeyEntry(friendlyName, new AsymmetricKeyEntry(bouncyCastleKeyPair.Private), new[] { certEntry });
using (MemoryStream pfxStream = new MemoryStream())
{
pkcs12Store.Save(pfxStream, null, new SecureRandom());
pfxStream.Seek(0, SeekOrigin.Begin);
byte[] rawData = pfxStream.ToArray();
var result = Pkcs12Utilities.ConvertToDefiniteLength(rawData);
var microsoftCert = new X509Certificate2();
microsoftCert.Import(result, (string)null, X509KeyStorageFlags.UserKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
return microsoftCert ;
}
这似乎起作用的部分原因是我可以在 MMC 中看到一个新证书,告诉我该证书有效并且我有该证书的私钥。中还有一个新条目%USER_HOME%\AppData\Roaming\Microsoft\SystemCertificates\My\Keys
。
但是当我使用它时certutil -user -store my
,它告诉我“缺少存储的密钥集”。所以存储的证书似乎错过了存储密钥的链接或有错误的链接。
我认为这只是缺少一个小细节,但我就是不知道它是什么。有任何想法吗?
顺便说一句,我已经尝试按照我在网上找到的一些主题中的建议使用密钥和容器的密码,但这也无济于事。