2009-07-30 6 views
26

보안 응용 프로그램의 경우 대화 상자에서 인증서를 선택해야합니다. C#을 사용하여 인증서 저장소 또는 그 일부 (예 : storeLocation="Local Machine"storeName="My")에 액세스하고 거기에서 모든 인증서 모음을 가져 오려면 어떻게해야합니까? 귀하의 도움에 미리 감사드립니다.C#의 인증서 저장소에서 인증서 목록 가져 오기

답변

4

예 - X509Store.Certificates 속성은 X.509 인증서 저장소의 스냅 숏을 반환합니다.

45
X509Store store = new X509Store("My"); 

store.Open(OpenFlags.ReadOnly); 

foreach (X509Certificate2 mCert in store.Certificates){ 
    //TODO's 
} 
+9

오타가 발생할 가능성을 제거하려면 StoreName과 StoreLocation이라는 열거 형을 사용해야합니다. –

13

이 시도 :

//using System.Security.Cryptography.X509Certificates; 
public static X509Certificate2 selectCert(StoreName store, StoreLocation location, string windowTitle, string windowMsg) 
{ 

    X509Certificate2 certSelected = null; 
    X509Store x509Store = new X509Store(store, location); 
    x509Store.Open(OpenFlags.ReadOnly); 

    X509Certificate2Collection col = x509Store.Certificates; 
    X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(col, windowTitle, windowMsg, X509SelectionFlag.SingleSelection); 

    if (sel.Count > 0) 
    { 
     X509Certificate2Enumerator en = sel.GetEnumerator(); 
     en.MoveNext(); 
     certSelected = en.Current; 
    } 

    x509Store.Close(); 

    return certSelected; 
} 
+9

Linq는 다음과 같이 쉽게 만듭니다. x509Store.Certificates.OfType (). FirstOrDefault (cert => cert.IssuerName.Name.EndsWith ("DC = mysite, DC = com")); –

+0

@JonathanDeMarks : "DC = mysite, DC = com"은 정확히 여기서 무엇을 의미합니까? 이 예제들 중 _specific_ 인증서를 얻는 방법을 보여주는 것 같지는 않습니다 ... – Nyerguds

+0

@Nyerguds 질문 : 인증서 저장소에서 C#의 인증서 목록을 얻으십시오. 다른 질문을 만드십시오. – Cobaia

7

그렇게하는 가장 간단한 방법은 당신이 원하는 인증서 저장소를 열고 다음 X509Certificate2UI을 사용하는 것입니다. X509Certificate2UI on MSDN에서

var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
store.Open(OpenFlags.ReadOnly); 
var selectedCertificate = X509Certificate2UI.SelectFromCollection(
    store.Certificates, 
    "Title", 
    "MSG", 
    X509SelectionFlag.SingleSelection); 

더 많은 정보를 제공합니다.

+1

'X509Certificate2UI'를 사용하려면'System.security.dll'에 대한 참조를 추가해야합니다. 그러나 이것은 매력 +1':)'처럼 작동합니다. 또한 사용자 키 스토어를 사용하기 위해서'StoreLocation.CurrentUser' 대신'StoreLocation.LocalMachine'을 사용합니다. – albciff