2009-07-30 35 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(証明書>証明書.IssuerName.Name.EndsWith( "DC = mysite、DC = com")); –

+0

@JonathanDeMarks:「DC = mysite、DC = com」は正確に何を意味していますか?これらの例のどれも_specific_証明書を取得する方法を示していないようです... – Nyerguds

+0

@Nyerguds質問は次のとおりです。C#の証明書ストアから証明書のリストを取得します。もう一度質問を作成してください。 – Cobaia

7

それを行うための最も簡単な方法は、あなたがしたい証明書ストアを開設してからX509Certificate2UIを使用することです。

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

詳細はX509Certificate2UI on MSDNです。

+1

'X509Certificate2UI'を使うには' System.security.dll'への参照を追加する必要がありますが、これはcharm +1 ':)'のように動作します。また、ユーザーキーストアを使うために、私は 'StoreLocation.LocalMachine'の代わりに' StoreLocation.CurrentUser'を使います。 – albciff

関連する問題