如何在AppData \ Roaming \ Microsoft \ Crypto \ Keys \下删除由X509Certificate2.ctor()创建的文件?

时间:2018-03-27 14:10:38

标签: .net certificate x509certificate x509certificate2

每当执行此操作时:

new X509Certificate2(bytes)

...在C:\Users\[user]\AppData\Roaming\Microsoft\Crypto\Keys\

下创建了一个新文件

我在完成证书后如何删除此文件?

我试过了:

using(new X509Certificate2(bytes)) {...}

不。

...
cert.Reset();
...

不。

尝试将字节写入文件并从中读取。

不。

还有其他建议吗?

1 个答案:

答案 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将创建一个新文件。知道删除什么是很难的,超出了这个答案的范围。