2014-03-24 108 views
3

我們在ASP.NET應用程序中創建一個X509Certificate2對象以進行定期傳出連接。創建X509Certificate2時是否阻止創建文件?

C:每這些證書之一是創建一個新的文件時,在創建\ ProgramData \微軟\加密\ RSA \ MachineKeys的

該文件夾現在擁有4萬個文件,從來沒有得到清理。我試圖消除堅持標誌

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

//沒有X509KeyStorageFlags.PersistKeySet

但這並不能幫助 - 仍然可以在每次調用的2K位文件。

當我看到this answer時,我得到了我的希望,但這是一臺2008 R2服務器,臨時文件不是0字節,所以它似乎是另一種情況。

如何在不填滿磁盤的情況下使用X509Certificate2?

回答

1

要重現您的問題,我創建了此示例代碼。我的測試環境是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之間波動。

所以我的建議是當您不再需要X509Certificate2實例時,請致電cert.Reset();

+0

當我讀到您的建議時,我很興奮,但後來發現我已經打電話重置:(一個區別可能是我將證書傳遞給SslStream.AuthenticateAsClient,所以我想知道是否可能會添加對文件的引用。 – DougN

+0

僅供參考,當認證垃圾收集時,它與調用Reset()具有相同的效果。如果您現在需要該磁盤空間,調用重置只是一種加速清理的方法 –

+0

感謝您的信息。 – pepo

2

Use .NET 4.6

X509Certificate2實現IDisposable接口開始 在.NET Framework 4.6;在以前版本的.NET Framework中, X509Certificate2類不實現此接口,因此 因此Dispose方法不存在。

0

我在我們的服務器上有同樣的問題。我現在發現的最好方法是通過腳本刪除文件(除了有用的文件)。

例外列表:

- > 6de9cb26d2b98c01ec4e9e8b34824aa2 ...

  • MS IIS DCOM服務器 - > 7a436fe806e483969f48a894af2fe9a1 ...
  • TSSecKeySet1解決方案仍是一個補丁MachineKeys文件夾中沒有生成文件會更好。