2013-05-22 55 views

Trả lời

13

Sử dụng số Format method của phần mở rộng cho phiên bản có thể in.

X509Certificate2 cert = /* your code here */; 

foreach (X509Extension extension in cert.Extensions) 
{ 
    // Create an AsnEncodedData object using the extensions information. 
    AsnEncodedData asndata = new AsnEncodedData(extension.Oid, extension.RawData); 
    Console.WriteLine("Extension type: {0}", extension.Oid.FriendlyName); 
    Console.WriteLine("Oid value: {0}",asndata.Oid.Value); 
    Console.WriteLine("Raw data length: {0} {1}", asndata.RawData.Length, Environment.NewLine); 
    Console.WriteLine(asndata.Format(true)); 
} 
+3

tôi cần phải thêm .Extensions, như vậy : foreach (Tiện ích mở rộng X509Extension trong cert.Extensions) – dcrobbins

7

Để có được "Subject Tên thay thế" từ một giấy chứng nhận:

X509Certificate2 cert = /* your code here */; 

Console.WriteLine("UpnName : {0}{1}", cert.GetNameInfo(X509NameType.UpnName, false), Environment.NewLine); 
1

Tôi đã tạo ra một chức năng để làm điều này:

private static List<string> ParseSujectAlternativeName(X509Certificate2 cert) 
{ 
      var result = new List<string>(); 

      var subjectAlternativeName = cert.Extensions.Cast<X509Extension>() 
               .Where(n => n.Oid.FriendlyName.EqualsCase(SubjectAlternativeName)) 
               .Select(n => new AsnEncodedData(n.Oid, n.RawData)) 
               .Select(n => n.Format(true)) 
               .FirstOrDefault(); 

      if (subjectAlternativeName != null) 
      { 
       var alternativeNames = subjectAlternativeName.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); 

       foreach (var alternativeName in alternativeNames) 
       { 
        var groups = Regex.Match(alternativeName, @"^DNS Name=(.*)").Groups; 

        if (groups.Count > 0 && !String.IsNullOrEmpty(groups[1].Value)) 
        { 
         result.Add(groups[1].Value); 
        } 
       } 
      } 

      return result;   
} 
Các vấn đề liên quan