web-dev-qa-db-ja.com

X509Storeのすべての証明書を取得する方法

次のコードを使用して、asp.net webappからPCのすべての証明書を取得しています。証明書のコレクションが空であり、その理由がわかりません。

自分のユーザーアカウントになりすましてみましたが、うまくいきませんでした。私は何を間違えていますか?

var store = new X509Store(StoreLocation.CurrentUser); //StoreLocation.LocalMachine fails too
var certificates = store.Certificates;
foreach (var certificate in certificates)
{
    var friendlyName = certificate.FriendlyName;
    Console.WriteLine(friendlyName);
}

//original problem: fetch a single certificate by its subject name
X509Certificate2 clientCertificate = CertificateUtility.GetCertificate(StoreName.My, StoreLocation.CurrentUser,  "CN=mypc.domainname"); //returns null :(
41
Pablo

次のコード行を2行目に追加し、動作を確認します。

store.Open(OpenFlags.ReadOnly);

そして、これは下部にあります:):

store.Close();
56

一体となって...

Httpsを使用するApacheサーバー(xamp)があります。 httpsとc#(vs2010)を介してPHPアップロードページにアクセスします。

  1. たとえば、個人フォルダー証明書に証明書をインストールします。

  2. 証明書を表示するには、少なくともwin7で "certmgr.msc"を実行します

個人証明書のリスト

var store = new X509Store(StoreLocation.CurrentUser); 

store.Open(OpenFlags.ReadOnly); 

var certificates = store.Certificates;
foreach (var certificate in certificates)
{
    var friendlyName = certificate.FriendlyName;
    var xname = certificate.GetName(); //obsolete
    Console.WriteLine(friendlyName);
}

store.Close();

特定の証明書を見つける

string certificateName = "CN=localhost"; //name found in the var xname
X509Store storex = new X509Store(StoreName.My, StoreLocation.CurrentUser);
                    storex.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certificatesx =
            storex.Certificates.Find(X509FindType.FindBySubjectName, 
            certificateName,
            true);

X509Certificate certificatex = certificates[0];

storex.Close();
18
cealex

証明書を見つけることができます...

var certificateStore = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine);

certificateStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

var certificateCollection = certificateStore.Certificates.Find(X509FindType.FindBySubjectName, "mycert.me.com",false);

certificateStore.Close();

var certificate = certificateCollection[0];

certificateCollectionには、私が気にする証明書があります...それが1つだけの場合、コレクションの最初の要素を取得します。

3
Nabheet

証明書ストア(mmc/add/certificate snap-in/my user account/Certificates-Current User/Personal/Certificates)でサブジェクト名を確認し、「CN = mypc.domainname」が実際に証明書にあることを確認します。

"CN=mypc.domainname"

"CN = mypc.domainname"

...等

1
rick schott