2014-10-19 122 views
1

我想解析X509 sertificate自定义扩展。 (我创建了一个自定义扩展类型为“证书策略”的自签名证书)。我需要解析这个“证书策略”及其值。编程方式,我可以得到定制extention是“证书策略”的名字,但我不能说我现在用的就是它的values..The代码如下所示:如何解析X509 SSL证书自定义扩展“证书策略”?

public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
    { 
     var cert = (X509Certificate2)certificate; 
     foreach (X509Extension ext in cert.Extensions) 
     { 
      // AsnEncodedData x = new AsnEncodedData(ext.Oid, ext.RawData); 
      MessageBox.Show("Name: " + ext.Oid.FriendlyName + "\nValue: " + ext.Oid.Value); 

     } 

     return true; 
    } 

此代码onlye显示“证书政策“但我需要的政策在下面所示的解析元素:在证书策略元素

值:求助

[1]Certificate Policy: 
    Policy Identifier=1.2.3.4 
[2]Certificate Policy: 
    Policy Identifier=1.5.6.7.8 
[3]Certificate Policy: 
    Policy Identifier=1.3.5.8 
    [3,1]Policy Qualifier Info: 
      Policy Qualifier Id=CPS 
      Qualifier: 
       Tarzano 
    [3,2]Policy Qualifier Info: 
      Policy Qualifier Id=User Notice 
      Qualifier: 
       Notice Reference: 
        Organization=Tarzano Ltd 
        Notice Number=1, 2, 3, 4 
       Notice Text=Buraya mesaj yazilabilir 

的感谢!

回答

0

首先,您需要一个ASN.1解析器并使用X.509 ASN.1模块将扩展值解码为一组策略。我编写了一个托管类,用于扩展PowerShell PKI模块中.NEt库中现有的X.509扩展。您可以从PSPKI项目网站获取托管的.dll或项目源:http://pspki.codeplex.com/以了解如何解码此扩展(我使用自己的ASN.1解析器,因此代码片段在这里没有多大意义),如果您想要拥有自己的东西(并且不依赖第三方组件)。

还有一个PKI.Core.dll(也附有源代码)。 System.Security.Cryptography.X509Certificates命名空间中定义了X.509扩展类。和该文档在文档库中的文档:http://pkix2.sysadmins.lv/library/html/T_System_Security_Cryptography_X509Certificates_X509CertificatePoliciesExtension.htm 扩展是以类似的方式(从X509Extension类继承)作为.NET本地进行创建的,除了我的扩展完全是本地的(不使用CryptoAPI C++函数,如在.NET中)。

+1

感谢您的回答CryptoGuy。此课程解决了我的问题: http://msdn.microsoft.com/en-us/library/system.security.cryptography.asnencodeddata(v=vs.110).aspx – user2084339 2014-10-25 19:05:50

0

在.NET中,似乎没有内置的支持来解析x509扩展的ASN.1数据,而不是.Format()方法,如果遇到任何未知对象类型,该方法将恢复为返回十六进制编码的字符串。

但是,也可通过NuGet获得的广泛使用的BouncyCastle库https://www.bouncycastle.org/csharp/具有良好的ASN.1解析支持。以下是打印证书扩展中找到的所有OID类型对象的示例。它适用于.NET无法解析和显示的扩展。 Org.BouncyCastle.Asn1.Utilities.Asn1Dump.DumpAsString()方法也很有用。

using System; 
using System.IO; 
using System.Linq; 
using System.Collections.Generic; 
using System.Security.Cryptography.X509Certificates; 
using Org.BouncyCastle.Asn1; 
public class AsnTest { 
    public static void Main() { 
     var certificate = new X509Certificate2(File.ReadAllBytes("Test.x509")); 
     foreach (var ext in certificate.Extensions) { 
      // This is as far as we reliably get with native .NET libraries, switch to BouncyCastle for additional parsing 
      var o = new Asn1InputStream(ext.RawData).ReadObject(); 
      var q = new Queue<Asn1Sequence>(); 
      var i = new List<DerObjectIdentifier>(); 
      if (o is Asn1Sequence) { 
       q.Enqueue(o as Asn1Sequence); 
      } else if (o is DerObjectIdentifier) { 
       i.Add(o as DerObjectIdentifier); 
      } 
      while (q.Any()) { 
       var s = q.Dequeue(); 
       i.AddRange(s.OfType<DerObjectIdentifier>()); 
       foreach (var n in s.OfType<Asn1Sequence>()) 
       { 
        q.Enqueue(n); 
       } 
      } 
      if (i.Any()) { 
       Console.WriteLine("Found the follwing OID value(s) in the " + ext.Oid.Value + " extension: " + string.Join(", ", i.Select(j => j.Id))); 
      } else { 
       Console.WriteLine("Found no OID values in the " + ext.Oid.Value + " extension."); 
      } 
     } 
    } 
}