2012-01-17 2 views
1

Windows 서비스가 로컬 시스템 권한으로 실행되는 서버 하나와 클라이언트가 세 대 있습니다. 클라이언트와 서버는 SSL과 TCP (SSLStream 클래스 C++ \ CLI http://msdn.microsoft.com/en-us/library/system.net.security.sslstream(v=vs.90).aspx#Y1124)를 사용하여 상호 인증됩니다.SSL을 통한 TCP 인증서로 Windows 서비스 인증

문제는 호스트를 인증하기 때문에 3 개의 인증서 (각 클라이언트마다 하나씩)가 필요하다는 것입니다. . 이제 Windows 서비스이 아닌 호스트를 인증하려고하므로 모든 호스트에 대해 동일한 인증서를 배포 할 수 있습니다.

누구나 어떻게 알 수 있습니까?

--- EDIT 1 ---- 내가하고 싶은 것을 보여주기 위해. 모든 Microsoft Office 복사본에는 암호화 된/인증 된 채널을 통해 Microsoft 서버와 통신하는 데 사용되는 인증서가 배포됩니다.

-이 해결 - 존 말했듯이

내 문제는 SslStream 클래스는 호스트 이름을 포함 표준 유효성 검사를 수행이었다. 나는 커스텀 RemoteCertificateValidationCallback을 제공하고 이제는 작동한다.

bool ValidateServerCertificate(Object^ sender, X509Certificate^ certificate, X509Chain^ chain, SslPolicyErrors sslPolicyErrors) {    

    Console::Write("[+] Validating server certificate: ");         

    // check certificate hash                
    if(certificate->GetCertHashString()->Equals("cert hash")) {                           
     Console::Write("oK\n");              
     return true;                 
    }                      

    Console::Write(" ERROR\n");     
    Console::WriteLine("[-] Hash doesn't match");         

    // Do not allow this client to communicate with unauthenticated servers.       
    return false;                                                 
} 
+0

는 클라이언트와 동일한 Windows 도메인의 서버 모두 예를 들어, 여기에 맹목적으로 어떤 인증서를 받아 발리이야? 인터넷을 통해 서버에 액세스합니까? –

+0

아니요, 그들은 같은 도메인에 있지 않으며 그렇습니다. 서버는 인터넷을 통해 액세스됩니다. – DropTheCode

+0

그래서 세 개의 호스트 모두에 동일한 인증서를 배포하고이를 인증에 사용 하시겠습니까? 어떻게 배포하고 싶습니까? '.pfx' 파일? – Jon

답변

0

예를 들어 인증서를로드하기 만하면됩니다. 파일에서 가져 와서 특정 인증서를 사용하여 인증하십시오. 당신은 연결의 서버 측에서이 작업을 수행하려면 다음

var certificate = new X509Certificate2("cert.pfx"); 
sslStream.AuthenticateAsServer(certificate); 

그리고 클라이언트 측에서

는 : 인증서 암호로 보호 된 파일에있는 경우

X509Certificate certificate = new X509Certificate2("cert.pfx"); 
var certCollection = new X509CertificateCollection(new[] { certificate }); 
sslStream.AuthenticateAsClient(targetHost, certCollection, protocols, checkRevocation); 

X509Certificate2 생성자에 두 번째 매개 변수는있다 암호를 수락합니다. 물론 클라이언트와 서버에 다른 인증서를 사용하려고합니다.

업데이트 :

그래서 문제는 .NET은 (호스트의 유효성을 검사 포함) 표준 유효성 검사를 수행시키기 때문에 사용자의 인증서가 인정되지 않는다는 것 같다. SslStreamconstructorRemoteCertificateValidationCallback을 입력하기 만하면됩니다. 그런 다음 원하는 모든 수표를 만들 수 있습니다.

private bool DefaultCertificateValidationHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors) 
{ 
    return true; 
} 
+0

하지만 x509 인증서의 SUBJECT 필드는 호스트/웹 사이트의 이름이어야합니다. 호스트가 아닌 Windows 서비스를 인증해야합니다. – DropTheCode

+0

@drop : 업데이트를 참조하십시오. 그러나 * 모든 관련 정보 (예 : 전체 그림, 수행 한 작업, 문제의 원인)를 제공하십시오. – Jon

+0

도움을 주셔서 감사합니다.하지만 어쩌면 내 문제를 이해하지 못할 수도 있습니다. 나는 1 개의 서버와 3 개의 클라이언트를 가지고 있으며 각 클라이언트마다 윈도우 서비스가 runnnig되어있다. 이 Windows 서비스의 목표는 서버에 연결하고 일부 메시지를 교환하는 것입니다. 이 통신은 SSLStream 클래스와 .pfx 인증서 (x509)를 사용하여이를 암호화하고 인증해야합니다 (양면). 그것은 잘 작동하지만 모든 클라이언트에서 ** 다른 ** 인증서가 필요합니다. 모든 클라이언트에 대해 단 하나의 인증서 만 사용하고 싶습니다.이 작업을 수행하려면 호스트가 아닌 Windows 서비스를 인증해야한다고 생각합니다. – DropTheCode