2017-10-19 3 views
0

서명 된 토큰을받는 웹 응용 프로그램이 있으며 최종 사용자의 컴퓨터에 사전 설치된 인증서로 해당 서명을 확인해야합니다. 저장소에 액세스하여 사용하려는 정확한 인증서를 가져오고 지금까지 저장소에 도달하여 인증서를 계산할 수 있지만 특정 인증서를 찾을 수 없습니다.Windows 인증서 저장소 (C# - ASP.Net)에서 특정 인증서 찾기

내 전략은 주체 이름별로 인증서 검색 결과를 채우는 것입니다. 정확히 필요한 인증서를 선택하기에 충분하므로 컬렉션의 첫 번째 요소를 가져 와서 사용합니다. 이것은 내가 아래 코드에서하고있는 것과 지금까지는 항상 certs이 비어 있고 문자열로 변환 할 수 없다는 예외가 발생했습니다.

일련 번호로 검색하면 제대로 작동하지만 인증서의 일련 번호는 00이고 내 저장소에는 8 개가 있습니다!

상점에서 특정 인증서를 가져 와서 프로그래밍 방식으로 사용할 수 있습니까?

X509Store st0re = new X509Store(StoreName.Root, StoreLocation.CurrentUser); 
      st0re.Open(OpenFlags.ReadOnly); 
      count = st0re.Certificates.Count;  //Count the certificates in the store 
      X509Certificate2Collection certs = st0re.Certificates.Find(
       X509FindType.FindBySubjectName, 
       "C=US, S=WA, L=Redmond, O=Microsoft Corporation, OU=Web Services", 
       true); 
      st0re.Close(); 

      Output = certs[0].ToString();  // = count.ToString() 
+0

최종 사용자의 컴퓨터에서 - 원격 클라이언트입니까? 지옥, 안돼! 안돼, 미안, 당신이 뭔가 잘못하려하고 있기 때문이야. 웹 응용 프로그램에는 클라이언트 리소스에 대한 액세스 권한이 없습니다. 그리고하지 말라. 비슷한 질문에 대한 설명이 있습니다. https://stackoverflow.com/a/46707759/3997611 – Crypt32

+0

내가 뭘하려고하는지 명확히 해 드리겠습니다. 타사 SSO에 연결된 여러 웹 응용 프로그램이 있습니다. 서버에서 사용자가 URL을 탐색하면 해당 SSO 서버로 리디렉션되어 로그인하고 서명 된 쿠키로 다시 리디렉션됩니다. 쿠키를 제한된 페이지에 넣기 전에 쿠키를 확인하고 싶습니다. 그래서 인증서를로드하고 그것을 사용하여 토큰 서명을 확인하려고합니다. – j0zeft

+0

위 링크를보세요. 웹 응용 프로그램에서 클라이언트 리소스에 액세스 할 수 없으며 액세스 할 수없는 이유를 분명하게 설명합니다. 필수 정보는 웹 응용 프로그램에 미리 구성되거나 기본 프로토콜에 이러한 기능이있는 경우 클라이언트가 제공해야합니다. 인증서에 쿠키가 포함되어 있지 않으면 로컬 (웹 서버) 인증서 저장소를 사용하여 서명의 유효성을 검사하는 데 필요한 인증서를 얻어야합니다. – Crypt32

답변

0

는 Crypt32 @에서 제안을 고려 후, 나는 응용 프로그램이 호스팅되는 위치에 내 토큰을 이동, 그래서 이런 식으로 나는 인증서를 최종 사용자의 컴퓨터에서 찾고 아니지만, 대신 로컬 것 응용 프로그램을 호스팅하는 서버에 저장됩니다. 토큰을 검색하려면, 난 아주 약간의 편집과 질문에이 동일한 코드를 사용

X509Store st0re = new X509Store(StoreName.Root, StoreLocation.CurrentUser); 
     st0re.Open(OpenFlags.ReadOnly); 
     count = st0re.Certificates.Count;  //Count the certificates in the store 
     X509Certificate2Collection certs = st0re.Certificates.Find(
      X509FindType.FindBySubjectDistinguishedName, 
      "C=US, S=WA, L=Redmond, O=Microsoft Corporation, OU=Web Services", 
      true); 
     st0re.Close(); 

     Output = certs[0].ToString();  // = count.ToString() 

내가 한 모든,이 경우 X509FindType.FindBySubjectDistinguishedName 와 인증서 주체의 모든 요소를 ​​X509FindType.FindBySubjectName를 교체했다 정확한 형식으로 나열되어야합니다.