簡體   English   中英

如何從.NET中的X509證書中提取電子郵件?

[英]How to extract the Email from a X509 Certificate in .NET?

我正在尋找從X509證書獲取電子郵件(字符串)的方法。 我找不到准備好的財產或方法。 因此,對我來說最好(對於未來任務最靈活)是通過ASN OID(1.2.840.113549.1.9.1)獲取值。 如何使用本機.NET類執行此操作?

我試圖使用AsnEncodedData.format但沒有任何影響。 有沒有辦法做到這一點?

如果可以使用第三方工具,那么您可以查看我的Powershell PKI模塊。 該模塊包含一個PKI.Core.dll庫,它是一組API。 API文檔中有相當詳細的API 文檔

使用這個庫我會使用以下靜態方法和自定義類:

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方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM