2012-02-15 2 views
0

콘솔 응용 프로그램에서 인증 용 클라이언트 인증서가 필요한 WCF 서비스를 호출하고 있습니다. 관리자로 실행되는 Visual Studio 2010에서 디버그 모드로 콘솔 응용 프로그램을 실행하면 응용 프로그램이 내 컴퓨터에 클라이언트 인증서로 설치된 X509 인증서를 표시 할 수 없지만 동일한 프로그램이 Visual Studio (관리자로 실행되지 않음) , 응용 프로그램이 잘 작동하며 WCF 서비스에 클라이언트 인증서를 제공 할 수 있으며 WCF 서비스에서도 데이터를 반환합니다.관리자 모드에서 프로세스를 실행할 때 X509Certificate 개인 키 문제

클라이언트 인증서와 서버 인증서는 모두 회사의 내부 CA에서 발급합니다. Windows 7에서 실행 중이며 .Net 4.0을 사용 중입니다.

Visual Studio 추가 기능에서 상호 SSL을 사용하여 동일한 WCF 서비스를 호출 할 때 동일한 문제가 발생합니다. 내 VS 관리 모드에서 실행중인 경우 WCF 서비스 호출이 실패하지만 그렇지 않으면 제대로 작동합니다.

작업 관리자에서 VS 프로세스를 볼 때 (관리자와 비 관리자 모두) 프로세스 사용자를 내 ID로 표시하므로 어떤 인증서 액세스 문제도 될 수 없으므로 혼동하지 않습니다. .

조언이나 도움이 도움이 될 것입니다. 코드 조각 :

private static void MutualSslServiceCall() 
    { 

     var testClient = new LocalService.Service1Client("MutualSsl"); 
     testClient.ClientCredentials.ClientCertificate.Certificate = GetClientCertificate(); 

     var response = testClient.GetData(3232); 
     Console.WriteLine("Done, Resposne = {0}", response); 
     Console.ReadLine(); 
    } 


    // gets the certificate from the workstation certificate store. 
    private static X509Certificate2 GetClientCertificate() 
    { 
     X509Certificate2 certificate = null; 
     var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
     try 
     { 
      store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly|); 
      // Nothing to do if no cert found. 
      if (store.Certificates != null && store.Certificates.Count > 0) 
      { 
       if (store.Certificates.Count == 1) 
       { 
        // Return the certificate present. 
        certificate = store.Certificates[0]; 
       } 
       else 
       { 
        // Request the user to select a certificate 
        var certificates = X509Certificate2UI.SelectFromCollection(store.Certificates, "Digital Certificates", "Select a certificate from the following list:", X509SelectionFlag.SingleSelection); 
        // Check if one has been returned 
        if (certificates != null && certificates.Count > 0) 
        { 

         certificate = certificates[0]; 



        } 
       } 
      } 
     } 
     finally 
     { 
      store.Close(); 
     } 
     return certificate; 
    } 

오류 : { "권한 XXXX와 SSL/TLS에 대한 보안 채널을 설정할 수 없습니다."}

의 InnerException : { "요청이 중단되었습니다 : SSL을 만들 수 없습니다/TLS 보안 채널. "}

덕분에,

rauts

+0

오류 메시지뿐 아니라 인증서를 할당하는 코드 스 니펫을 공유 하시겠습니까? –

+0

안녕하세요 .. 적어도 인증서를로드 할 수 있습니까? 나는 인증서 = 인증서 [0]을 의미한다. 그것에 인증서가 있습니까? – Shetty

+0

예 ... 인증서 컬렉션에 인증서를로드 할 수 있지만 사용하려고 할 때 개인 키가 필요하며 실패 할 때입니다. – rauts

답변

1

내가 직면 매우 비슷한 문제가 있었지만 내 경우에는 그 반대 방향이었습니다. 관리자 권한으로 실행하면 모든 것이 잘 작동하고 다른 경우에는 인증서의 개인 키를 가져 오는 데 문제가있었습니다 (동일한 오류가 발생했습니다 : "보안을 설정할 수 없습니다. 권한 XXXX가있는 SSL/TLS 용 채널 ").

해결책은 다음과 같습니다. 시스템에 인증서를 설치할 때 인증서 (따라서 인증서의 개인 키)를 내보낼 수 있어야했습니다. 이 방법으로 인증서를 설치 한 계정뿐만 아니라 다른 인증서도 사용할 수 있습니다 (물론 특정 인증서 저장소에 액세스 할 수있는 사람과 개인 키를 저장하는 파일 만 사용할 수 있습니다).

개인 키 파일 here에 대한 액세스 권한 부여에 대한 추가 정보.