【问题标题】:How to extract the Email from a X509 Certificate in .NET?如何从 .NET 中的 X509 证书中提取电子邮件?
【发布时间】:2014-11-21 15:06:14
【问题描述】:

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

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

【问题讨论】:

  • this page 上的示例可能有帮助?
  • 谢谢!就是这样!但是您对其他解决方案有什么建议(通过相应的 OID 获得像电子邮件这样的任何扩展名)?
  • 对不起,我没有这方面的经验,谷歌很好,你没有其他评论/答案:)
  • 无法通过内置工具实现。您将不得不寻找第 3 方库。但是感谢您的想法,这确实值得考虑。
  • 谢谢,CryptoGuy!它会为我节省很多时间!对于最后一个问题,您更喜欢哪个 3rd 方库? BouncyCastle 是否有任何没有详细记录的替代品?

标签: c# .net x509certificate asn.1


【解决方案1】:

如果可以使用 3rd 方工具,那么你可以看看我的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 =&gt; x.OID.Value == "1.2.840.113549.1.9.1");。请注意,特定的 RDN 属性可能会出现多次,因此您不应使用 First*Single* Linq 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2017-07-21
    • 2017-05-03
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多