C# X509Certificate2 私钥在GC发生时消失

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

我遇到了一个非常奇怪的加密证书问题。我将带有 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
) 也是专门选择的,旨在解决该问题。有人经历过这种行为吗?是垃圾收集器造成的吗?

环境:

  • Windows 11、Windows 10、Windows 7
  • C#、.NET Core3.1 和 .NET Framework 4.7
c# windows-10 garbage-collection x509certificate2 certificate-store
1个回答
0
投票

根本原因是由于旧框架中的一些错误,我使用 .NET 8 运行了相同的代码,问题就消失了......但是,因为我不能直接切换旧应用程序来使用 .NET 8 ,我必须在 Core 3.1 下保持所有内容不变,并在纯 .NET 8 下编译一个新的可执行文件,然后通过

Process.Start()
执行这个微小的可执行文件。它并不完全优雅,但它有效。

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