.NET环境下如何获取X509证书的属性证书信息
你可以通过X509Certificate2实例的Extensions属性获取证书内置的所有属性(扩展)数据,以下是修改后的可直接运行的代码:
X509Store store = new X509Store("MY", StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates; X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, false); X509Certificate2Collection scollection = X509Certificate2UI.SelectFromCollection(fcollection, "Test Certificate Select", "Select a certificate from the following list to get information on that certificate", X509SelectionFlag.MultiSelection); foreach (X509Certificate2 x509 in scollection) { Console.WriteLine("证书名称: {0}{1}", x509.GetNameInfo(X509NameType.SimpleName, true), Environment.NewLine); Console.WriteLine("===== 证书属性列表 ====="); // 遍历所有属性(扩展) foreach (X509Extension ext in x509.Extensions) { Console.WriteLine($"属性OID:{ext.Oid.Value}"); Console.WriteLine($"属性名称:{ext.Oid.FriendlyName}"); Console.WriteLine($"是否关键属性:{ext.Critical}"); // 获取属性原始二进制数据 byte[] attrRawData = ext.RawData; Console.WriteLine($"属性原始数据长度:{attrRawData.Length}字节"); // 如果是已知类型的扩展,可以转成强类型读取结构化内容,举个例子: if (ext.Oid.Value == "2.5.29.17") // 使用者可选名称SAN的OID { X509SubjectAlternativeNameExtension sanExt = (X509SubjectAlternativeNameExtension)ext; foreach (var name in sanExt.EnumerateDnsNames()) { Console.WriteLine($"SAN DNS名称:{name}"); } } Console.WriteLine("------------------------"); } } store.Close();
- 如果你要获取的是独立的属性证书(Attribute Certificate, AC),这类证书通常不内嵌在普通X.509公钥证书中,若你的业务场景中AC存储在普通证书的某个自定义扩展字段中,只需要匹配对应扩展的OID,读取
RawData后再按照AC的结构解析即可。 - .NET内置了多种常用扩展的强类型封装,比如
X509KeyUsageExtension、X509EnhancedKeyUsageExtension等,不需要手动解析二进制数据,直接类型转换即可使用。
内容的提问来源于stack exchange,提问作者Artsem
相关产品推荐
相关产品推荐

