2017-12-11 15 views
1

클라이언트 인증서로 내부적으로 응용 프로그램을 인증하려면 makecert 응용 프로그램을 사용하여 루트 인증서와 클라이언트 인증서를 만들었습니다.makecert를 사용하여 인증서 해지 목록 (CRL)을 만든 다음 pvk2pfx를 사용하여 .pfx로 묶습니다.

모든 것이 잘 작동하지만, 나는 다음과 같은 오류를 얻을 X509Certificate2 Verify 방법을 사용하는 경우 :

The revocation function was unable to check revocation for the certificate

X509Certificate2 cert = actionContext.Request.GetClientCertificate(); 
cert.Verify(); 

을 나는 X509Chain을 만들어이 문제를 가져온 다음 RevocationMode = X509RevocationMode.NoCheckX509ChainPolicy을 설정할 수 있습니다.

X509Certificate2 cert = actionContext.Request.GetClientCertificate(); 

if (cert == null) 
{ 
    actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized) 
    { 
     ReasonPhrase = "Client Certificate Required" 
    }; 
} 
else 
{ 
    X509Chain chain = new X509Chain(); 

    //Needed because the error "The revocation function was unable to check revocation for the certificate" will happen otherwise 
    chain.ChainPolicy = new X509ChainPolicy() 
    { 
     RevocationMode = X509RevocationMode.NoCheck, 
    }; 
    try 
    { 
     var chainBuilt = chain.Build(cert); 
     Debug.WriteLine(string.Format("Chain building status: {0}", chainBuilt)); 

     if (chainBuilt == false) 
     { 
      actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized) 
      { 
       ReasonPhrase = "Client Certificate not valid" 
      }; 
      foreach (X509ChainStatus chainStatus in chain.ChainStatus) 
      { 
       Debug.WriteLine(string.Format("Chain error: {0} {1}", chainStatus.Status, chainStatus.StatusInformation)); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     Debug.WriteLine(e.ToString()); 
    } 
} 

그러나이 문제에 관심이 있습니다. 거기에 Certificate Revocation List (CRL)makecert으로 만든 다음 X509Certificate2 Verify에 허용되는 pvk2pfx과 함께 .pfx로 묶을 수 있습니까?

+0

'makecert'는 더 이상 사용되지 않습니다. https://msdn.microsoft.com/en-us/library/windows/desktop/aa386968(v=vs.85).aspx. 'X509Certificate2.Verify()'에만 의존하기를 원한다면, 응용 프로그램이 전 세계적으로 유효한 인증서를 받아 들일 것이기 때문에 잘못하고있다. – Crypt32

+0

@ Crypt32 입력 해 주셔서 감사합니다. 인증서가 루트 CA에서 발급되었는지 확인하는 별도의 방법이 있습니다. 확인은 유효한 인증서를 보내는 첫 번째 확인 일뿐입니다. – Ogglas

+0

'X509Certificate2.Verify '는 프레임 워크에서 가장 무의미한 메소드 중 하나입니다. 'true'를 리턴하면 문맥에서 유효한지 알아 내기 위해 아마했던 것과 동일한 체인을 만들어야 할 것입니다. 'false'를 반환하면 체인을 스스로 구축하여 "거짓"이 당신에게 적합한 지 아닌지 판단 할 수 있습니다. 체인 객체를 수동으로 생성하는 것이 좋습니다. – bartonjs

답변

0

msdn에 대한 해결책을 찾았습니다.

makecert -crl -n "CN=RootCATest" -r -sv RootCATest.pvk RootCATest.crl 

모두 서버와 클라이언트 컴퓨터에 CRL 파일을 설치하십시오 : 당신이 당신의 루트 인증서가 다음 명령을 실행 만든 후

https://msdn.microsoft.com/en-us/library/ff648732.aspx

. MMC를 사용하여 신뢰할 수있는 루트 인증 기관 저장소에있는 클라이언트 및 서버 컴퓨터에 RootCATes.crl을 설치합니다.

MMC -> 파일 -> 스냅인을 추가 또는 제거 -> 인증서 -> 내 사용자 계정

신뢰할 수있는 루트 인증 기관 -> 인증서 -> 오른쪽 클릭 -> 모든 작업 -> 가져 오기 -> RootCATest. crl

pvk2pfx 번들과 함께 번들링하지는 않았지만 확인 후에 실행할 수 있습니다.