创建X509Certificate2时是否阻止文件创建?

时间:2014-03-24 19:15:51

标签: c# ssl certificate x509certificate x509certificate2

我们在ASP.NET应用程序中创建一个X509Certificate2对象,以定期传出连接。每次创建其中一个证书时,都会在以下位置创建一个新文件:

C:\ ProgramData \微软\加密\ RSA \ MachineKeys的

该文件夹现在有400万个永远不会被清理的文件。我已经尝试删除Persist标志

  

new X509Certificate2(certBytes,p12Pwd,   X509KeyStorageFlags.MachineKeySet);

     

//没有X509KeyStorageFlags.PersistKeySet

但这没有用 - 每次通话都会得到2Kb文件。

当我看到this answer时,我对此抱有希望,但这是一个2008 R2服务器,临时文件不是0字节,所以它似乎是一个不同的情况。

如何在不填满磁盘的情况下使用X509Certificate2?

4 个答案:

答案 0 :(得分:4)

为了重现您的问题,我创建了此示例代码。我的测试环境是Windows 8.1 64位,应用程序是用.NET 4.5编写的。

using System.IO;
using System.Security.Cryptography.X509Certificates;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var certBytes = File.ReadAllBytes(@"c:\cert.p12");
            var p12Pwd = "somepassword";

            for (var i = 0; i < 1000; i++)
            {
                var cert = new X509Certificate2(certBytes, p12Pwd, X509KeyStorageFlags.MachineKeySet);

                // this line helped keep filesize from growing   
                // cert.Reset(); 
            }
        }
    }
}

我感到震惊的是C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys的文件大小达到了2MB。然后应用程序退出,文件大小下降到20K(这可能是它的起始大小)。

然后我添加了cert.Reset();(我在上面的代码中对它进行了评论)。当您不再需要X509Certificate2实例时,应该调用此方法。之后,C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys的文件大小在20K到22K之间闪烁。

所以我的建议是,当您不再需要cert.Reset();个实例时,请致电X509Certificate2

答案 1 :(得分:4)

我的服务器上也有同样的问题。我现在找到的最好的方法是从我的代码中删除文件。

using System;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.IO;
using System.Security.Cryptography.X509Certificates;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Byte[] bytes = File.ReadAllBytes(@"D:\tmp\111111111111.p12");
            X509Certificate2 x509 = new X509Certificate2(bytes, "qwerty", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
            var privateKey = x509.PrivateKey as RSACryptoServiceProvider;
            string uniqueKeyContainerName = privateKey.CspKeyContainerInfo.UniqueKeyContainerName;
            x509.Reset();

            File.Delete(string.Format(@"C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\{0}", uniqueKeyContainerName));
        }
    }
}

答案 2 :(得分:2)

Use .NET 4.6

  

X509Certificate2实现以。开头的IDisposable接口   .NET Framework 4.6;在以前版本的.NET Framework中,   X509Certificate2类没有实现此接口,并且   因此,Dispose方法不存在。

答案 3 :(得分:2)

我的服务器上也有同样的问题。我现在找到的最好的方法是通过脚本删除文件(有用文件除外)。

例外列表:

  • Microsoft Internet Information Server - &gt; c2319c42033a5ca7f44e731bfd3fa2b5 ...
  • NetFrameworkConfigurationKey - &gt; d6d986f09a1ee04e24c949879fdb506c ...
  • iisWasKey - &gt; 76944fb33636aeddb9590521c2e8815a ...
  • WMSvc证书密钥容器 - &gt; bedbf0b4da5f8061b6444baedf4c00b1 ...
  • iisConfigurationKey - &gt; 6de9cb26d2b98c01ec4e9e8b34824aa2 ...
  • MS IIS DCOM服务器 - &gt; 7a436fe806e483969f48a894af2fe9a1 ...
  • TSSecKeySet1 - &gt; f686aace6942fb7f7ceb231212eef4a4 ...
  • https://forums.whirlpool.net.au/archive/1683713

通过https://forums.iis.net/t/1224708.aspx?C+ProgramData+Microsoft+Crypto+RSA+MachineKeys+is+filling+my+disk+space

此解决方案仍然是补丁。最好不要在MachineKeys文件夹中生成文件。