我应该处置X509Certificate2吗?

时间:2019-05-28 07:51:34

标签: c# identityserver4 idisposable x509certificate2 asp.net-core-2.2

我正在使用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对象吗?


来自Microsoft Docs

  

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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