2014-11-21 101 views
2

我正在寻找从X509证书获取电子邮件(字符串)的方式。 我无法找到现成的属性或方法。所以对我来说最好的(对未来任务最灵活)是通过ASN OID(1.2.840.113549.1.9.1)获取值。我如何使用本机.NET类来做到这一点?如何从.NET中的X509证书中提取电子邮件?

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

+2

[本页]上的示例(http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.x509certificates.x509nametype%28v=vs.110%29.aspx)可能有帮助吗? – Bridge 2014-11-21 15:57:41

+0

谢谢!而已!但是,你可以提出有关其他解决方案的建议(通过相应的OID获得任何类似电子邮件的扩展名) – 2014-11-21 16:17:33

+0

对不起,我没有这方面的经验,只是与谷歌和你​​没有其他评论者/答案:) – Bridge 2014-11-21 16:29:31

回答

1

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

随着THID库记录在案我会与下面的静态方法和自定义类去:

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