2011-08-18 3 views
0

ClickOnce 배포 매니페스트를 동적으로 생성하고 서명하는 데 사용하고있는 Thawte의 코드 서명 인증서가 있습니다. 문제는 우리가 IIS 또는 다시 가져 서명 인증서를 다시 시작할 때 생성 흔적이 매니페스트 ASP.NET 응용 프로그램이 잘 작동하지만, 시간이 지남에 따라 다음과 같은 기능은 인증서 찾는데 실패 : 결국시간이 지남에 따라 ASP.NET 응용 프로그램에서 사라지는 인증서 저장소에 인증서가 저장되었습니다.

private static X509Certificate2 GetSigningCertificate(string thumbprint) 
{ 
    X509Store x509Store = new X509Store(StoreLocation.CurrentUser); 
    try 
    { 
     x509Store.Open(OpenFlags.ReadOnly); 
     X509Certificate2Collection x509Certificate2Collection = x509Store.Certificates.Find(
      X509FindType.FindByThumbprint, thumbprint, false); 

     if (x509Certificate2Collection.Count == 0) 
      throw new ApplicationException(
       "SigningThumbprint returned 0 results. Does the code signing certificate exist in the personal store?", 
       null); 

     if (x509Certificate2Collection.Count > 1) 
      throw new ApplicationException(
       "SigningThumbprint returned more than 1 result. This isn't possible", null); 

     var retval = x509Certificate2Collection[0]; 

     if(retval.PrivateKey.GetType() != typeof(RSACryptoServiceProvider)) 
      throw new ApplicationException("Only RSA certificates are allowed for code signing"); 

     return retval; 
    } 
    finally 
    { 
     x509Store.Close(); 
    } 
} 

을 응용 프로그램이 인증서를 찾을 수없는 오류를 던지기 시작합니다. 왜냐하면 우리가 ASP.NET 응용 프로그램을 시작할 때 인증서를 찾지 만 인증서가 올바르게 설치되었다고 생각하기 때문입니다. 그러나 어떤 시점에서는 Count == 0 분기를 맞추기 만하면됩니다. 인증서는 응용 프로그램 풀 사용자의 "현재 사용자 \ 개인"인증서 저장소에 있습니다.

질문 : 갑자기 "갑자기 사라지거나"발견되지 않는 이유는 무엇입니까?

답변

1

우리가 직접 (고통스럽게) 알아 냈습니다.

LocalMachine 저장소에 인증서를 설치해야하고 응용 프로그램 풀 계정이 ASP.NET 응용 프로그램에서 사용될 경우 WinHttpCertCfg 또는 CACLS.exe를 사용하여 인증서에 대한 읽기 권한이 있어야합니다. 응용 프로그램 풀을 실행하는 계정의 CurrentUser 저장소를 사용하여 문제가 발생했습니다. 필자는 대화 형 로그온 세션에서 실행되고 있지 않은 사용자로부터 CurrentUser 저장소에 액세스하는 것에 대해 완전히 차가지지 않은 일종의 경쟁 조건이 있다고 생각합니다.

ClickOnce 배포 매니페스트 작성/서명을 수행하기 위해 MAGE 도구를 호출했기 때문에 처음에는이 작업을 수행 할 수 없었습니다. 코드 서명 인증서가 CurrentUser \ My 저장소에 있어야합니다. 그러나 우리는 a) 템플릿 파일에서 매니페스트를 생성하고 대체해야하는 값을 대체하고 b) BuildTasks에있는 리플렉션을 통해 MAGE 코드를 호출하여 매니페스트에 서명함으로써 MAGE의 필요성을 제거했습니다. v3.5 DLL. 결과적으로 우리는 매니페스트에 서명하는 데 사용하는 인증서를보다 잘 제어 할 수 있으며 원하는 곳 어디에서나 사용할 수 있습니다. 그렇지 않으면 우리는 조금 "낮은 수준"으로 가지 않으면 막혔을 것입니다.