You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

问题:下方C#代码无法显示本地计算机中的证书

解决C#无法显示本地证书的问题

看你的代码片段,应该是在尝试读取本地的几个证书存储,但没成功把证书列出来对吧?我帮你梳理下常见问题,再给你修正后的可运行代码:

可能踩坑的地方

  • 打开证书存储时没指定正确的OpenFlags,导致没法正常读取证书内容
  • 只定义了存储名称,但没遍历每个存储里的具体证书条目
  • 访问**本地计算机(LocalMachine)**的存储时,大概率需要管理员权限,普通权限会读不到

修正后的完整代码

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        // 先初始化DataGridView的列,用来展示证书信息
        dataGridView1.Columns.Add("Name", "证书名称");
        dataGridView1.Columns.Add("HasPrivateKey", "是否含私钥");
        dataGridView1.Columns.Add("Location", "存储位置");
        dataGridView1.Columns.Add("Issuer", "颁发机构");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        dataGridView1.Rows.Clear();
        // 列出要检查的存储:包含名称、显示名、存储位置(当前用户/本地计算机)
        var targetStores = new List<(StoreName StoreName, string DisplayName, StoreLocation Location)>
        {
            (StoreName.My, "个人(当前用户)", StoreLocation.CurrentUser),
            (StoreName.Root, "受信任根证书(当前用户)", StoreLocation.CurrentUser),
            (StoreName.TrustedPublisher, "受信任发布者(当前用户)", StoreLocation.CurrentUser),
            (StoreName.My, "个人(本地计算机)", StoreLocation.LocalMachine),
            (StoreName.Root, "受信任根证书(本地计算机)", StoreLocation.LocalMachine)
        };

        foreach (var storeInfo in targetStores)
        {
            using (var certStore = new X509Store(storeInfo.StoreName, storeInfo.Location))
            {
                try
                {
                    // 以只读模式打开已存在的存储,避免创建新存储或修改内容
                    certStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
                    
                    // 遍历当前存储下的所有证书
                    foreach (var certificate in certStore.Certificates)
                    {
                        dataGridView1.Rows.Add(
                            certificate.SubjectName.Name,
                            certificate.HasPrivateKey ? "是" : "否",
                            storeInfo.DisplayName,
                            certificate.IssuerName.Name
                        );
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"读取存储 {storeInfo.DisplayName} 失败:{ex.Message}");
                }
                finally
                {
                    certStore.Close();
                }
            }
        }
    }
}

关键调整说明

  • 区分存储位置:证书分CurrentUser(当前登录用户专属)和LocalMachine(全局系统级)两个位置,之前的代码可能只查了一个位置,导致漏了证书
  • 正确打开存储:用OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly参数,确保安全读取已有存储,不会触发不必要的错误
  • 遍历证书条目:打开存储后必须循环certStore.Certificates集合,才能把每个证书的信息取出来展示
  • 权限提示:如果读取本地计算机的存储失败,记得右键程序图标,选择「以管理员身份运行」,因为系统级存储需要更高权限

额外优化建议

  • 可以添加证书过滤逻辑,比如只显示有效期内的证书:certStore.Certificates.Find(X509FindType.FindByTimeValid, DateTime.Now, false)
  • 如果不需要展示所有存储,可以删掉targetStores里不需要的条目

内容的提问来源于stack exchange,提问作者Veera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:12:45