如何从.NET中的X509证书中提取电子邮件?

时间:2014-11-21 15:06:15

标签: c# .net x509certificate asn.1

我正在寻找从X509证书中获取电子邮件(字符串)的方法。 我无法为此找到现成的财产或方法。因此,对我来说最好(对于未来任务最灵活)是通过ASN OID(1.2.840.113549.1.9.1)获取值。我怎么能用本机.NET类做到这一点?

我尝试使用AsnEncodedData.format但没有任何效果。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

如果可以使用第三方工具,那么您可以查看我的Powershell PKI模块。该模块包含一个PKI.Core.dll库,它是一组API。 API在Library documentation

中有相当详细的记录

使用这个库我会使用以下静态方法和自定义类:

using PKI.ASN;
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace MyNamespace {
    public class RdnAttribute {
        public Oid OID { get; set; }
        public String Value { get; set; }
    }
    public class MyClass {
        public static List<RdnAttribute> GetRdnAttributes(X500DistinguishedName name) {
            List<RdnAttribute> retValue = new List<RdnAttribute>();
            ASN1 asn = new ASN1(name.RawData);
            asn.MoveNext();
            do {
                ASN1 asn2 = new ASN1(asn.Payload);
                asn2.MoveNext();
                List<Byte> oidRawData = new List<Byte>(asn2.Header);
                oidRawData.AddRange(asn2.Payload);
                Oid oid = ASN1.DecodeObjectIdentifier(oidRawData.ToArray());
                asn2.MoveNext();
                String value;
                switch (asn2.Tag) {
                    case (Byte)ASN1Tags.UniversalString:
                        value = Encoding.UTF32.GetString(asn2.Payload);
                        break;
                    case (Byte)ASN1Tags.BMPString:
                        value = Encoding.BigEndianUnicode.GetString(asn2.Payload);
                        break;
                    default:
                        value = Encoding.UTF8.GetString(asn2.Payload);
                        break;
                }
                retValue.Add(new RdnAttribute { OID = oid, Value = value });
            } while (asn.MoveNextCurrentLevel());
            return retValue;
        }
    }
}

该方法返回RDN属性的数组(无序),其中OID属性包含RDN对象标识符,Value属性包含RDN文本值。如果您可以使用Linq,那么您可以快速搜索集合:somearray.Where(x => x.OID.Value == "1.2.840.113549.1.9.1");。请注意,特定的RDN属性可能会多次出现,因此您不应使用First*Single* Linq方法。