C# 我应该处置X509E2吗?

C# 我应该处置X509E2吗?,c#,identityserver4,idisposable,x509certificate2,asp.net-core-2.2,C#,Identityserver4,Idisposable,X509certificate2,Asp.net Core 2.2,我正在使用IdentityServer4,我想从文件中加载签名证书。比如说, var certificate = new X509Certificate2( path, password, X509KeyStorageFlags.EphemeralKeySet); services.AddIdentityServer() .AddSigningCredential(certificate) ... certificate.Di

我正在使用IdentityServer4,我想从文件中加载签名证书。比如说,

var certificate = new X509Certificate2(
        path, 
        password, 
        X509KeyStorageFlags.EphemeralKeySet);

services.AddIdentityServer()
        .AddSigningCredential(certificate)
...
certificate.Dispose();
当我从IdentityServer请求令牌时,上面的代码将不起作用。但如果我删除
certificate.Dispose(),它将起作用

我还尝试了另一种选择。我从证书的私钥创建了
RsaSecurityKey
,并将其用于添加签名凭证。在这种情况下,处理不会破坏任何东西

var rsk = new RsaSecurityKey(certificate.GetRSAPrivateKey()))

services.AddIdentityServer()
        .AddSigningCredential(rsk)
...
certificate.Dispose()
所以我的问题更一般。是否应处置从现有证书创建的
X509Certificate2
对象


发件人:

从.NET Framework 4.6开始,这种类型实现IDisposable接口。使用完该类型后,应直接或间接处置它


不,您不应该在应用程序运行时处置证书对象,因为当被请求时,IdentityServer将尝试使用已处置的证书对象,并且将失败。

通过查看.NET核心源代码,X509Certificate2及其基类X509Certificate使用类CertificatePal处理证书。类支持从各种来源创建类的对象:blob、文件、证书存储。它在创建对象时调用Windows CryptoAPI以获取证书的句柄。因此,在使用对象之后,有必要释放句柄指向的资源。好消息是,句柄存储在SafeCertContextHandle对象中,保证在垃圾收集器收集X509Certificate2对象并完成调用对象的终结器后关闭句柄。我的理解是,我们不需要手动调用Dispose方法。

是的,这在第一种情况下是合理的。但通过
RsaSecurityKey
我可以处理证书。我想知道我是否正确使用了证书,也许还有另一种方法。我昨晚读了下面的博文,它也让我研究了这个问题:我的代码正在使用构造函数,从不处理或调用
Reset
方法。在我的本地机器、dev和staging服务器上,在过去一年中,我在Microsoft用于存储
X509Certificate2
文件的各个文件夹中没有看到超过两个文件,因此我猜垃圾回收正在清理它,正如您所说的。