每当执行此操作时:
new X509Certificate2(bytes)
...在C:Users[user]AppDataRoamingMicrosoftCryptoKeys
完成证书后如何删除此文件?
我尝试了:
using(new X509Certificate2(bytes)) {...}
nope。
...
cert.Reset();
...
nope。
尝试将字节写入文件并从中读取。
nope。
其他建议?
如果您不设置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将创建一个新文件。知道要删除的内容很难,超出了这个答案的范围。