每当执行此操作时:
new X509Certificate2(bytes)
...在C:\Users\[user]\AppData\Roaming\Microsoft\Crypto\Keys\
我在完成证书后如何删除此文件?
我试过了:
using(new X509Certificate2(bytes)) {...}
不。
...
cert.Reset();
...
不。
尝试将字节写入文件并从中读取。
不。
还有其他建议吗?
答案 0 :(得分:0)
如果您没有设置X509KeyStorageFlags.PersistKeySet
,那么当您处置(或重置)证书时,或者以后收集垃圾时,该文件应该被删除。
如果您设置了X509KeyStorageFlags.PersistKeySet,那么.NET将不再自动删除它,您必须手动执行此操作。
try
{
AsymmetricAlgorithm alg = cert.PrivateKey;
if (alg is RSACryptoServiceProvider rsaCsp)
{
rsaCsp.PersistKeyInCsp = false;
rsaCsp.Dispose();
}
else if (alg is DSACryptoServiceProvider dsaCsp)
{
dsaCsp.PersistKeyInCsp = false;
dsaCsp.Dispose();
}
return;
}
catch (CryptographicException)
{
// Maybe not a CAPI key
}
try
{
CngKey cngKey = null;
using (RSA rsa = cert.GetRSAPrivateKey())
using (DSA dsa = cert.GetDSAPrivateKey())
using (ECDsa ecdsa = cert.GetECDsaPrivateKey())
{
if (rsa is RSACng rsaCng)
{
cngKey = rsaCng.Key;
}
else if (dsa is DSACng dsaCng)
{
cngKey = dsaCng.Key;
}
else if (ecdsa is ECDsaCng ecdsaCng)
{
cngKey = ecdsaCng.Key;
}
}
if (cngKey != null)
{
cngKey.Delete();
cngKey = null;
}
}
catch (CryptographicException)
{
}
如果您没有设置PersistKeySet但是您的进程异常终止,则忘记密钥应该被删除的概念,新的PFX将创建一个新文件。知道删除什么是很难的,超出了这个答案的范围。