2013-08-21 3 views
3

일련 번호로 X509 인증서를 받아야합니다. 일련 번호가 있으며이를 통해 반복되고 있으며 필요한 컬렉션의 일련 번호를 볼 수는 있지만 결코 발견되지 않습니다. 하지만 분명히X509 상점에서 SerialNumber의 인증서를 찾을 수 없습니다.

0091ED5F0CAED6AD52‎‎=0091ED5F0CAED6AD52 
3D3233116A894CB244DB359DF99E7862=0091ED5F0CAED6AD52 

첫 번째 I 루프 : 여기

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
      store.Open(OpenFlags.ReadOnly); 

      foreach (X509Certificate2 cert in store.Certificates) 
      { 
       System.Web.HttpContext.Current.Response.Write (cert.SerialNumber + "=" + oauthCertificateFindValue + "<br/>"); 
       if (cert.SerialNumber == oauthCertificateFindValue) 
       { 
        System.Web.HttpContext.Current.Response.Write("<br/>FOUND FOUND FOUND<br/>"); 
       } 
      } 

이 코드의 출력입니다 : 여기

은 구약 내가 적절한 일련 번호를보고하고 확인 내 디버그 코드 일련 번호와 일치하지만 if은 항상 실패하며이 일련 번호를 기반으로 실제로 작업해야하는 항목도 실패합니다.

X509Certificate2Collection certificateCollection = store.Certificates.Find(x509FindType, oauthCertificateFindValue, false); 

    if (certificateCollection.Count == 0) 
       { 
        throw new ApplicationException(string.Format("An OAuth certificate matching the X509FindType '{0}' and Value '{1}' cannot be found in the local certificate store.", oauthCertificateFindType, oauthCertificateFindValue)); 
       } 

    return certificateCollection[0]; 

여기서 내가 뭘 잘못하고 있니?

+0

아무 것도 보이지 않습니다 ..'x509FindType'은 무엇입니까? 그것을 바꾸려고 했습니까? – PawanS

+0

우연히 표준 Windows 인증서보기 대화 상자에서 일련 번호를 복사 했습니까? 대화 상자에서 복사 할 때 복사 한 문자열 시작 부분에 보이지 않는 문자가 삽입되어 조회가 실패하는 유사한 문제가 발견되었습니다. 'oauthCertificateFindValue.Length'가 일련 번호의 예상 길이인지 확인하십시오. (또한 16 진수 문자열로 표현하면 2로 나눌 수 있습니다). – Iridium

+0

나는 certs를 반복하여 일련 번호를 얻었고 특별히 필요한 것을 찾는 사람들을 출력했습니다. – Slee

답변

2

찾으려는 인증서의 인증서 일련 번호에는 두 개의 보이지 않는 문자가 표시되어 일치하지 않는 것으로 나타납니다. 당신이 당신의 foreach 루프의 출력을 변경할 경우이 작업을 확인 할 수 있어야한다 :

System.Web.HttpContext.Current.Response.Write (string.Format("{0} (Length: {1}) = {2} (Length: {3})<br/>", cert.SerialNumber, cert.SerialNumber.Length oauthCertificateFindValue, oauthCertificateFindValue.Length); 

당신거야 가능성이 가장 높은 값이 동일한 보이지만, 그 길이가 이러한 눈에 보이지 않는 문자의 존재를 나타내는 (다른 것을 참조).

보이지 않는 문자를 포함한 인증서의 일련 번호와 일치하도록 검색 값을 업데이트해야합니다.

+0

방금 ​​발견했습니다 - 저주스러운 성가신! 고마워요! – Slee

0

열린 첫 번째 X509Store 아직 닫히지 않았으며 이미 읽은 인증서를 가져 오려고했습니다.

먼저 저장소에서 읽고있는 코드와 일련 번호와 일치하는 코드에서 저장소를 닫은 다음 저장소를 다시 엽니 다.

다음 코드는 저에게 효과적입니다. 한번만 확인하십시오.

private static void CompareCertSerialse() 
    { 
     string oauthCertificateFindValue = "7C00001851CBFF5E9F563E236F000000001851"; 

     X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 

     store.Open(OpenFlags.ReadOnly); 

     foreach (X509Certificate2 cert in store.Certificates) 
     { 
      Console.WriteLine(cert.SerialNumber + "=" + oauthCertificateFindValue); 
      if (cert.SerialNumber == oauthCertificateFindValue) 
      { 
       Console.WriteLine("FOUND FOUND FOUND>"); 

      //Close the store 
       store.Close(); 
       GetCert(oauthCertificateFindValue);      
      } 
     } 
    } 


private static X509Certificate2 GetCert(string oauthCertificateFindValue) 
    { 
     //Reopen the store 
     X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
     store.Open(OpenFlags.ReadOnly); 

     X509Certificate2Collection certificateCollection = store.Certificates.Find(X509FindType.FindBySerialNumber, oauthCertificateFindValue, false); 

     if (certificateCollection.Count == 0) 
     { 
      Console.WriteLine("Nothing Found"); 
     } 

     return certificateCollection[0]; 
    }