通过删除多个 RSA 文件而不触及 IIS 文件来清理我的 MachineKeys 文件夹

Tho*_*dax 6 iis rsa x509certificate2

我目前正在使用应用程序实例化证书在我的服务器上运行 IIS。

通过执行此代码,例如:

X509Certificate2 myX509Certificate = new 
X509Certificate2(Convert.FromBase64String(byteArrayRawCertificate), passwordCertificate, 
X509KeyStorageFlags.Exportable | 
X509KeyStorageFlags.MachineKeySet | 
X509KeyStorageFlags.PersistKeySet);
Run Code Online (Sandbox Code Playgroud)

该代码工作正常。但是我在我的电脑上遇到了一个问题,在以下文件夹中:

C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

3KB RSA 文件不断添加到该文件夹​​中。现在,我有超过一百万个这样的文件:

在此处输入图片说明

我想删除这些文件,但是:

  • IIS 使用其中之一来加密密码,或者可能用于其他目的,我不知道是哪一个,
  • 删除这么大的文件夹可能需要时间(比如几天)

    1. 有没有一种简单的方法可以不一次又一次地创建这些文件?(如果我在实例化我的证书时没有提到“MachineKeySet”,这将不起作用)
    2. 如果没有,有没有办法在不删除 IIS 文件的情况下删除创建的文件?
    3. 有没有办法检测 IIS 使用了哪些文件?

在此先感谢您的帮助。

hal*_*nlv 6

遇到了同样的问题,并且很害怕删除某些内容,正如我在其他来源上读到的那样,那里有一些系统关键文件。通过删除这几个,您最终可能会弄乱 IIS 或其他软件。

由于我在那里有 8'000'000 个文件,我什至无法打开该文件夹 - 我所做的是在 C# 中制作小程序,根据 OWNER 判断删除文件 - 创建它们的用户!如果它们是由 IIS 用户创建的,那么这样做是安全的(请确保您了解自己在做什么!)

        var userNameToDeleteBy = "IIS_App_Pool_User_Goes_here!";

        var allFiles = (new DirectoryInfo(Directory.GetCurrentDirectory()).EnumerateFiles());

        var i = 0;

        foreach (var file in allFiles)
        {

            var fname = file.FullName;
            string user = System.IO.File
                .GetAccessControl(fname)
                .GetOwner(typeof(System.Security.Principal.NTAccount))
                .ToString();

            if(user.Contains(userNameToDeleteBy))
            {
                File.Delete(fname);
                i++;
            }

            //output only every 1k files, as this is the slowest operation
            if (i % 1000 == 0) Console.WriteLine("Deleted: " + i); 
        }
Run Code Online (Sandbox Code Playgroud)

此外,如果您确实需要从文件加载证书,这里是有关如何使文件夹无垃圾的答案:

创建 X509Certificate2 时阻止文件创建?


Cry*_*t32 5

有一些工作适合你。首先,您 *不得*X509Certificate2每次需要访问 PFX 文件时从 PFX 文件中实例化对象。这是非常糟糕的主意。这会导致在 MachineKeys 文件夹中生成一个新的密钥文件。相反,您必须将证书安装到本地证书存储区一次,然后引用已安装的证书。

使用X509Store.Add()方法将证书安装到本地存储:

X509Certificate2 myX509Certificate = new 
X509Certificate2(Convert.FromBase64String(byteArrayRawCertificate), passwordCertificate, 
X509KeyStorageFlags.MachineKeySet);
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(myX509Certificate);
store.Close()
Run Code Online (Sandbox Code Playgroud)

下次您需要访问您的证书和私钥时,请使用相同的X509Store类,如下所示:

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 myCert = store.Certificates.Find(blablabla);
store.Close()
Run Code Online (Sandbox Code Playgroud)

而不是“ blablabla”,指定搜索过滤器:X509Certificate2Collection.Find()。您可以使用各种过滤器选项来定位您的证书。最常用的是指纹。

关于大文件夹。如果您确定 LocalMachine\My 存储中没有其他证书,您可以简单地清除所有内容,然后使用上面的代码安装您的证书。

  • 这似乎没有回答这个问题:“如何从 RSA\MachineKeys 中删除不需要的文件”。我错过了什么吗? (2认同)