2017-07-15 244 views
-1

我有以下代码来获取证书:获取本地计算机上安装的所有证书

X509Store store = new X509Store("??","??"); 
      List<X509Certificate2> lst = new List<X509Certificate2>(); 
      store.Open(OpenFlags.ReadOnly); 

      foreach (X509Certificate2 mCert in store.Certificates) 
      { 

       lst.Add(mCert); 
       //TODO's 
      } 

现在我想安装在本地计算机的所有证书在 列表<>与证书名称,他们的位置,发行公钥 或私钥(在是或否)和 包含那些证书的文件夹名称(请参考下面的快照):

enter image description here

填充列表<>与证证书的详细信息后,我想在一个网格格式来显示这些数据。如何修改此代码以获取以上详细信息?

+0

获得在PowerShell中这样的列表是递归枚举'证书的问题:'“驱动器”。所以这是可能的。 – Richard

+0

@Richard你能告诉我如何通过PowerShell实现这一点吗? – LogicalDesk

+1

'get-childitem cert:-recurse'是一个开始, – Richard

回答

1

你的机器上的证书存储在不同的商店,所以你需要把它们全部打开。请参阅MSDN 文章。

代码示例:

public class CertDetails 
{ 
    public string Name { get; set; } 
    public string HasPrivateKey { get; set; } 
    public string Location { get; set; } 
    public string Issuer { get; set; } 
} 

// stores and they friendly names 
var stores = new Dictionary<StoreName, string>() 
{ 
    {StoreName.My, "Personal"}, 
    {StoreName.Root, "Trusted roots"}, 
    {StoreName.TrustedPublisher, "Trusted publishers"} 
    // and so on 
    }.Select(s => new {store = new X509Store(s.Key, StoreLocation.LocalMachine), location = s.Value}).ToArray(); 

foreach (var store in stores) 
    store.store.Open(OpenFlags.ReadOnly); // open each store 

var list = stores.SelectMany(s => s.store.Certificates.Cast<X509Certificate2>() 
    .Select(mCert => new CertDetails 
    { 
     HasPrivateKey = mCert.HasPrivateKey ? "Yes" : "No", 
     Name = mCert.FriendlyName, 
     Location = s.location, 
     Issuer = mCert.Issuer 
    })).ToList(); 
+0

它工作正常,但我希望本地机器证书,但似乎只给予当前用户证书,请你修改代码来解决我的问题。谢谢 – LogicalDesk

+0

@CodeUnderflow,请参阅我的更新 –

1

为你的灵感简单例子,也许有点帮助:

using System.Security.Cryptography.X509Certificates; 
using System.Security.Cryptography; 
... 
X509Store store = null; 
store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly) 
... 

//RSA CryptoServiceProvider 
RSACryptoServiceProvider rsaCSP = null; 

string keyPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"\Microsoft\Crypto\RSA\MachineKeys\"; 

string friendlyName = ""; 

foreach (X509Certificate2 mCert in store.Certificates) { 

    rsaCSP = mCert.PrivateKey as RSACryptoServiceProvider; 

    if (rsaCSP != null) { 
    friendlyName = mCert.FriendlyName;      
    keyPath += rsaCSP.CspKeyContainerInfo.UniqueKeyContainerName; 
    }       
} 
+0

当我创建对象时,它不会返回任何内容 - X509Store store = new X509Store(); – LogicalDesk

+0

在我的本地计算机上安装了如此多的证书时,它仅提取2个证书。 – LogicalDesk

+0

但它做到了。我认为你必须改变商店(查找StoreName.My为其他值)或证书类型。 – creg

相关问题