我正在使用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接口。使用完该类型后,应直接或间接处理它。
答案 0 :(得分:1)
通过查看.NET Core源代码, X509Certificate2 及其基类 X509Certificate 使用类 CertificatePal 处理证书。 CertificatePal 类支持从各种来源创建该类的对象:blob,文件,证书存储。创建对象时,它将调用Windows CryptoAPI以获取证书的句柄。因此,在使用对象之后,有必要释放句柄指向的资源。好消息是,该句柄存储在 SafeCertContextHandle 对象中,保证在垃圾回收器收集 X509Certificate2 对象并完成对终结符的调用之后,该句柄将关闭对象。我的理解是,我们不需要手动调用 Dispose 方法。
答案 1 :(得分:0)
否,您不应该在应用程序运行时处置证书对象,因为当被请求时,IdentityServer将尝试使用处置的证书对象,并且会失败。