2011-10-08 8 views
7
난은 OpenSSL을 사용하여 (CA에 의해 서명)는 CA와 여러 인증서를 생성 한

파일 사용하여 원격 서버 X509Certificate에 확인하고 나는 .NET/C#을 클라이언트와 서버 모두 각각 자신의 인증서/키가 SslStream를 사용하여이 상호 인증이 활성화되고 해지가 비활성화됩니다.는 CA 인증서

나는 원격 서버의 인증서의 유효성을 검사 SslStream에 대한 RemoteCertificateValidationCallback을 사용하고 있는데 난 그냥 프로그램에서 (파일로) CA의 공개 인증서를로드하고 설치를 실제로보다는 원격 인증서를 확인하는 데 사용할 수있는 기대했다 Windows 인증서 저장소에있는 CA 문제는 X509Chain이 CA를 상점에 설치하지 않으면 다른 것을 표시하지 않으며 인증서 중 하나의 PEM 버전을 열 때 Windows CryptoAPI 셸이 표시됩니다.

내 질문은 RemoteCertificateValidationCallback, X509CertificateX509Chain 줄 것 같지 않을 때 Windows 인증서 저장소 나 WCF를 사용하지 않고 내 특정하여 CA 단지 CA의 공개 인증서 파일 을 사용하여 서명 한 어떻게 인증서를 확인할 수있다 나와 함께 할게 뭐야?

+1

Windows 저장소에 CA 인증서를 추가하면 X509Chain이 체인에 표시되지만 왜 그렇지 않은지 이해하지 못합니다. RemoteCertificateValidationCallback 내의 체인에 CA 인증서를 추가 할 사람이 있습니까? – user985122

+0

여전히 대답을 찾을 수 없습니다 : ( – user985122

답변

5

CA 인증서가 루트 인증서 저장소에 있지 않기 때문에, 당신은 RemoteCertificateValidationCallback() 내에서해야합니다SslPolicyErrors.RemoteCertificateChainErrors을의 에러 플래그; 가능성이 로컬 저장소를 사용하지 않기 때문에, 자신의 X509Certificate2Collection에 대해 명시 적으로 인증서 체인의 유효성을 검사하는 것입니다.

if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors) 
{ 
    X509Chain chain0 = new X509Chain(); 
    chain0.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
    // add all your extra certificate chain 
    chain0.ChainPolicy.ExtraStore.Add(new X509Certificate2(PublicResource.my_ca)); 
    chain0.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority; 
    isValid = chain0.Build((X509Certificate2)certificate); 
} 

할 수도 다시 사용하는 ExtraStore 모음에 추가 인증서를 추가, 콜백에 전달 체인을, 당신은 신뢰할 수없는 추가하기 때문에 필요한 AllowUnknownCertificateAuthority 플래그 확인 체인에 대한 인증서.

:

당신은 또한 (물론 새로운 신뢰할 수있는 CA의 루트를 추가 전역의 주요 보안 문제에 대한 팝업이 열립니다) 신뢰할 수있는 루트 저장소에 프로그래밍 CA 인증서를 추가하여 원래의 오류를 방지 할 수 RemoteCertificateValidationCallback, X509Certificate에와 X509Chain이 일을 나에게 아무것도주지하지 않는 것 때 인증서를 확인할 수있는 방법

var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser); 
store.Open(OpenFlags.ReadWrite); 
X509Certificate2 ca_cert = new X509Certificate2(PublicResource.my_ca); 
store.Add(ca_cert); 
store.Close(); 
+0

또 다른 가능성은 라이브러리'BouncyCastle'를 사용하여 인증서 체인을 만들고 신뢰를 확인하는 것입니다. 옵션은 명확하고 오류는 이해하기 쉽습니다. –

+0

응답 http를 참조하십시오. : //stackoverflow.com/a/27310276/1038496 여기에서 자신의 CA에 대한 올바른 검사를 할 수 있습니다. 위의 방법은 모든 CA를 허용합니다 (유효성 검사는 필요 없습니다). – Zoka

1

는 Windows 인증서 저장소 나 WCF를 사용하지 않고 내 특정하여 CA 단지 CA의 공용 인증서 파일을 사용하여 서명 한 와?

다음 코드는 Windows 인증서 저장소를 피하고 체인의 유효성을 검사합니다. JB의 코드와 약간 다른데, 특히 플래그를 사용하는 경우. 아래 코드는 AllowUnknownCertificateAuthority을 필요로하지 않습니다 (그러나 CRL이 없으므로 X509RevocationMode.NoCheck을 사용합니다).

함수의 이름은 중요하지 않습니다. 아래에서 VerifyServerCertificateSslStream 클래스의 RemoteCertificateValidationCallback과 같은 콜백입니다. 에 ServicePointManager으로 사용할 수도 있습니다.

static bool VerifyServerCertificate(object sender, X509Certificate certificate, 
    X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
    try 
    { 
     String CA_FILE = "ca-cert.der"; 
     X509Certificate2 ca = new X509Certificate2(CA_FILE); 

     X509Chain chain2 = new X509Chain(); 
     chain2.ChainPolicy.ExtraStore.Add(ca); 

     // Check all properties 
     chain2.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag; 

     // This setup does not have revocation information 
     chain2.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 

     // Build the chain 
     chain2.Build(new X509Certificate2(certificate)); 

     // Are there any failures from building the chain? 
     if (chain2.ChainStatus.Length == 0) 
      return true; 

     // If there is a status, verify the status is NoError 
     bool result = chain2.ChainStatus[0].Status == X509ChainStatusFlags.NoError; 
     Debug.Assert(result == true); 

     return result; 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
    } 

    return false; 
} 

나는 콜백을위한 필요가 없습니다 있도록 기본적으로이 체인 (아래 chain2)를 사용하는 방법을 생각하지 있습니다.즉, SSL 소켓에 설치하면 연결이 "잘 작동합니다". 그리고 나는 이 아니고은 콜백으로 전달되는 것을 어떻게 설치했는지 알아 냈습니다. 즉, 콜백을 호출 할 때마다 체인을 만들어야합니다. 나는 이것들이 .Net의 구조적 결함이라고 생각하지만, 명백한 것이 빠져있을 수도있다.

+0

'chain2'는 테스트 된 인증서와 루트 인증서 사이의 인증서 신뢰. 인증서에 대한 고급 작업을 수행하는 경우에는 요즘 BouncyCastle 라이브러리를 사용할 수 있습니다. –

관련 문제