2014-10-19 160 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."); 
      } 
     } 
    } 
}