【问题标题】:Get all certificates installed on Local machine获取本地计算机上安装的所有证书
【发布时间】:2017-07-15 09:04:49
【问题描述】:

我有以下代码来获取证书:

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
            }

现在我想获取安装在 Local Machine 中的所有证书 带有证书名称、位置、使用公钥颁发的列表 或私钥(仅限是或否)和文件夹的名称 包含这些证书(请参阅下面的快照):

使用证书详细信息填充 List 后,我想以网格格式显示这些数据。如何修改此代码以获取上述详细信息?

【问题讨论】:

  • 在 PowerShell 中获取这样的列表是递归枚举Cert:“驱动器”的问题。所以这是可能的。
  • @Richard 你能告诉我如何通过 powershell 实现这一点吗?
  • get-childitem cert: -recurse 是一个开始,
  • @Richard,它在遍历 TrustedPublisher、MCafee Trust 和 Root storeNames 后在 UserDS storeName 处引发异常。您能否提供完整的工作PowerShell脚本。谢谢
  • 你需要说出什么异常(它在我的机器上工作......)

标签: c# ssl-certificate x509certificate


【解决方案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();

【讨论】:

  • 它工作正常,但我也想要本地机器证书,但似乎它只提供当前用户证书,请您修改代码以解决我的问题。谢谢
【解决方案2】:

一个简短的例子来激发你的灵感,也许它会有所帮助:

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;
  }                        
}

【讨论】:

  • 当我使用 - X509Store store = new X509Store(); 创建对象时,它什么也不返回;
  • 当我的本地机器上安装了这么多证书时,它只获取 2 个证书。
  • 但它确实做到了。我认为您必须更改商店(将 StoreName.My 查找为其他值)或证书类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 2019-09-15
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多