2014-03-24 2 views
3

정기적 인 나가는 연결을 만들기 위해 ASP.NET 응용 프로그램에서 X509Certificate2 개체를 만듭니다.X509Certificate2를 만들 때 파일 생성을 방지 하시겠습니까?

C : 이러한 인증서 중 하나가 새로운 파일을 생성 할 때마다 생성됩니다 \ 경우 ProgramData \ 마이크로 소프트 \ 암호화 \ RSA \ MachineKeys 지금 청소 만나지 4 백만 파일이있는 폴더

. 나는 플래그를

새 X509Certificate2 (certBytes, p12Pwd, X509KeyStorageFlags.MachineKeySet)를 지속 제거하려고했습니다;

// 더 X509KeyStorageFlags.PersistKeySet

하지만 도움이되지 않습니다 - 여전히 모든 통화 KB의 파일을 얻을.하지

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

당신의 제안을 읽을 때 나는 흥분했다.하지만 이미 Reset이라는 것을 발견했다. (한가지 차이점은 SslStream.AuthenticateAsClient에 인증서를 전달하는 것이므로 파일에 대한 참조가 추가되었는지 궁금하다. .. 더보기 더보기 – DougN

+0

FY, cert 가비지 수집시 Reset() 호출과 동일한 효과가 있습니다. 디스크 공간을 원할 경우 리셋을 호출하면 정리 속도를 높일 수 있습니다. –

+0

정보 주셔서 감사합니다. 재설정 메서드로 시도하지 않았다. – pepo

2

Use .NET 4.6 :

X509Certificate2는 .NET 프레임 워크 4.6 로 시작으로 IDisposable 인터페이스를 구현; 이전 버전의 .NET Framework에서 X509Certificate2 클래스는이 인터페이스를 구현하지 않으므로 이므로 Dispose 메서드가 없습니다.

0

나는 우리 서버에서 같은 문제가 있습니다. 지금 내가 찾은 가장 좋은 방법은 스크립트를 통해 파일 (유용한 파일 제외)을 삭제하는 것입니다.

예외 목록 :

  • Microsoft 인터넷 정보 서비스 -> c2319c42033a5ca7f44e731bfd3fa2b5 ...
  • NetFrameworkConfigurationKey -> d6d986f09a1ee04e24c949879fdb506c ...
  • iisWasKey -> 76944fb33636aeddb9590521c2e8815a ...
  • WMSVC 인증서 키 컨테이너 -> bedbf0b4da5f8061b6444baedf4c00b1 ...
  • iisConfigurationKey -> 6de9cb26d2b98c01ec4e9e8b34824aa2 ...
  • MS IIS DCOM 서버 -> 7a436fe806e483969f48a894af2fe9a1 ...
  • TSSecKeySet1 -> 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 폴더에 파일을 생성하지 않는 것이 좋습니다.