专栏首页汪宇杰博客在UWP应用中读取系统证书信息

在UWP应用中读取系统证书信息

在Windows里,我们可以通过certmgr.msc查看和管理系统证书,这个工具是Windows自带的。

然而,如果我们希望在UWP应用中查看这些证书,该怎么做呢?

首先,我所介绍的方法其实不仅仅适用于UWP,事实上这是来自于我的一个WPF应用里的。正因为微软发布了.NET Standard 2.0标准,允许我们跨WPF以及UWP应用使用同一套代码,这就是我为何能够最终完成一个UWP版本的demo。

样例工程可以在我的GitHub找到 https://github.com/EdiWang/Cert-Scanner

解下来看看代码,核心代码如下:

需要引用的命名空间是System.Security.Cryptography.X509Certificates,如果你希望亲自实验这段代码,请记得引用这个命名空间。

public class SystemStorageCertificationScanner : CertificationScanner
{
    public override IEnumerable<CertInfo> ScanCertificates()
    {
        foreach (StoreLocation loc in Enum.GetValues(typeof(StoreLocation)))
        {
            foreach (StoreName n in Enum.GetValues(typeof(StoreName)))
            {
                X509Store store = new X509Store(n, loc);
                store.Open(OpenFlags.ReadOnly);
                foreach (var storeCertificate in store.Certificates)
                {
                    var certInfo = new CertInfo()
                    {
                        Subject = storeCertificate.Subject,
                        FriendlyName = storeCertificate.FriendlyName,
                        Issuer = storeCertificate.Issuer,
                        Version = storeCertificate.Version,
                        Thumbprint = storeCertificate.Thumbprint,
                        StoreLocation = loc.ToString(),
                        ExpDate = DateTime.Parse(storeCertificate.GetExpirationDateString()),
                        Abstract = storeCertificate.ToString()
                    };
                    yield return certInfo;
                }
                store.Close();
            }
        }
    }
}

这个例子里,StoreLocation 是一个枚举类型,只包含2个成员: CurrentUser, LocalMachine

StoreName 是另一个枚举,表示不同种类的证书的类别名称,成员如下:

public enum StoreName
{
  AddressBook = 1,
  AuthRoot = 2,
  CertificateAuthority = 3,
  Disallowed = 4,
  My = 5,
  Root = 6,
  TrustedPeople = 7,
  TrustedPublisher = 8,
}

解下来,我们就可以通过遍历每一个X509Store对象来获取它存储的证书。但请注意,每次操作我们都必须打开(open)和关闭(close)X509Store对象。

CertInfo 是我写的一个自定义类型,目的是为了让更加易于使用和显示证书信息。

public class CertInfo
{
    public string Subject { get; set; }
    public string FriendlyName { get; set; }
    public string Issuer { get; set; }
    public string Thumbprint { get; set; }
    public int Version { get; set; }
    public string StoreLocation { get; set; }
    public DateTime ExpDate { get; set; }
    public bool IsExpired => ExpDate < DateTime.Now;
    public string Abstract { get; set; }
}

为了让代码设计更加装逼,我添加了接口和抽象类。这些仅供代码设计参考,实际上如果你想直接了当写一个读取证书的逻辑,这些是没必要的。

public interface ICertificationScanner
{
    IEnumerable<CertInfo> ScanCertificates();
}
public abstract class CertificationScanner : ICertificationScanner
{
    public abstract IEnumerable<CertInfo> ScanCertificates();
}

我建立的UWP引用使用了 Windows Template Studio, 它提供了Telerik Data Grid控件,可以方便我们显示证书信息。并且我也使用了MvvM模式,在这里我就不讲解具体步骤了,因为和本文话题无关。

假设我们已经在应用里引用了Telerik Data Grid,解下来最直观的做法就是加一行XAML代码:

<tg:RadDataGrid ColumnDataOperationsMode="Flyout" x:Name="grid" ItemsSource="{x:Bind ViewModel.Source}" />

然后在ViewModel里获取数据

public class SystemCertsViewModel : ViewModelBase
{
    public SystemStorageCertificationScanner SysCertificationScanner { get; set; }


    public SystemCertsViewModel()
    {
        SysCertificationScanner = new SystemStorageCertificationScanner();
    }


    public ObservableCollection<CertInfo> Source => SysCertificationScanner.ScanCertificates().ToObservableCollection();
}

在这个例子里,ToObservableCollection是我的一个UWP助手库提供的方法,可以通过NuGet安装:

PM> Install-Package Edi.Uwp.Helpers

现在,运行结果就是

最后,需要完整样例代码,可以在我的GitHub找到:https://github.com/EdiWang/Cert-Scanner

本文分享自微信公众号 - 汪宇杰博客(ediwangblog),作者:汪宇杰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • .NET Core使用微软AI认知服务识别文字语言

    识别一段文字的语言有多种途径,在这个以AI为热点的时代,我们也可以给自己的应用强行加上AI,然后就能加上“智慧”的名字“自主研发成功”后去吹牛逼。今天我带大家来...

    Edi Wang
  • .NET Core 仿魔兽世界密保卡实现

    《魔兽世界》的老玩家都知道,密保卡曾经被用于登录验证,以保证账号安全。今天我用.NET Core模拟了一把密保卡(也叫矩阵卡)的实现,分享给大家。

    Edi Wang
  • .NET Core 如何验证信用卡卡号

    最近在家闲的蛋疼需要写点文章。正好我本人在金融科技公司工作,对信用卡业务略有了解。我们看看如何在 .NET Core 里验证一个信用卡的卡号是否合法。

    Edi Wang
  • 如何站在使用者的角度来设计SDK-微信公众号开发SDK(消息处理)设计之抛砖引玉

    0.SDK之必备的基本素质 在项目中免不了要用到各种各样的第三方的sdk,在我现在的工作中就在公司内部积累了各种各样的的公共库(基于.net的,基于silver...

    blackheart
  • 依赖注入容器-- Autofac

    Autofac---Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高...

    小世界的野孩子
  • java教程系列三:Java 命名规范

    Java命名规范是一种约定俗称的准则,应用程序开发者应遵循这些规范来在整个应用程序中编写可读的代码。如果团队不遵循这些规范,他们可能会编写出难以阅读和理解的程序...

    java干货
  • Java基础(二)面向对象(上)

    coders
  • Java几个重要关键字的使用

    跟类相关:package(包) class(类) abstract(抽象) extends(继承) implements(实现) interface(接口)

    用户7886150
  • MessagePack Java 0.6.X 可选字段

    https://www.cwiki.us/display/Serialization/QuickStart+For+MessagePack+Java+0.6.X

    HoneyMoose
  • Java面向对象之抽象类,接口

    抽象类: 含有抽象方法的类被声明为抽象类 抽象方法由子类去实现 含有抽象方法的类必须被声明为抽象类 抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中...

    二十三年蝉

扫码关注云+社区

领取腾讯云代金券