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

标签 c# .net x509certificate asn.1

我正在寻找从 X509 证书获取电子邮件(字符串)的方法。 我找不到现成的属性或方法。所以对我来说最好的(对 future 的任务最灵活)是通过 ASN OID (1.2.840.113549.1.9.1) 获取值。如何使用 native .NET 类执行此操作?

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

最佳答案

如果用3rd party工具没问题的话可以看看我的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 方法。

关于c# - 如何从 .NET 中的 X509 证书中提取电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27064336/

相关文章:

.net - 一个窗口中有多个Web浏览器 session /进程

c# - 使用正则表达式捕获两个单词之间的文本

c# - 当我真的需要继承两个类时如何处理CS1721?

c# - 使用 Parallel.ForEach 时跟踪进度

c# - 构建版本与修订号

c# - 在第二个条目中使用第一个条目的 ID c#

c# - 如何删除 makecert 添加的证书存储

c# - 我需要从字符串中去除所有符号以创建一个忽略标点符号的 `IEqualityComparer`

c# - X509 商店无法通过序列号找到证书

c++ - 获取Openssl证书错误中的错误字符串