我遇到了一个非常奇怪的加密证书问题。我将带有 1 个加密证书的 .p12 文件安装到
StoreName.MY
中,一切似乎都工作正常,我打开证书管理器,可以看到已安装的证书,我可以使用私钥导出它。但是,过了一段时间,私钥就会消失,我无法再使用私钥导出证书了。
用于安装证书的代码非常简单明了:
using (X509Store store = new X509Store(StoreName.My))
{
var collection = new X509Certificate2Collection();
// the p12 only have 1 cert (encryption) inside
byte[] data = Convert.FromBase64String(some.P12);
collection.Import(data, password,
X509KeyStorageFlags.Exportable |
X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.UserKeySet);
store.Open(OpenFlags.ReadWrite);
collection.ToList().ForEach((cert) => store.Add(cert));
store.Close();
foreach(X509Certificate2 cert in collection)
{
cert.Reset();
cert.Dispose();
}
}
我什至采取了额外的步骤来浏览集合和
Reset
+Dispose
安装的每个证书。但是,经过一段不确定的时间后,垃圾收集将会发生,私钥以及所有其他先前安装的加密证书的私钥都会消失......如果这些加密证书今天安装,几天也没关系前或几周前,他们都会消失。
过去一天我一直在互联网上四处寻找,找不到任何可以指引我正确方向的东西,正如您从上面的代码片段中看到的那样,我什至采取了额外的步骤来关闭所有
X509Store
所有
Dispose
对象的和
X509Certificate2
。
用于导入的标志 (
PersistKeySet
) 也是专门选择的,旨在解决该问题。有人经历过这种行为吗?是垃圾收集器造成的吗?
环境:
根本原因是由于旧框架中的一些错误,我使用 .NET 8 运行了相同的代码,问题就消失了......但是,因为我不能直接切换旧应用程序来使用 .NET 8 ,我必须在 Core 3.1 下保持所有内容不变,并在纯 .NET 8 下编译一个新的可执行文件,然后通过
Process.Start()
执行这个微小的可执行文件。它并不完全优雅,但它有效。