2010-05-13 8 views
6

Ich möchte den Inhalt eines csr in C# lesen, habe jedoch keine Möglichkeit gefunden, dies in C# zu tun. Was ich gefunden habe, die Namespace System.Security.Cryptography.X509Certificates war, aber es behandelt nur vorhandene Zertifikate, nicht Zertifikatsanforderungen:/Lesen einer Zertifikatsignierungsanforderung mit C#

Kann mir jemand einen Hinweis darüber geben? Vielen Dank im Voraus.

Jorge

+1

Ich habe keine Erfahrung damit, aber überprüfen Sie die Bouncy Castle API. Die Java-Implementierung liest CSRs, und die C# -Implementierung soll "die meisten" Java-Funktionen bereitstellen. http://www.bouncycastle.org/csharp/ –

Antwort

0

Es mir für Sie den besten Weg scheint ist die Nutzung nicht verwalteten CryptoAPI oder P/Invoke. CryptoAPI hat CERT_REQUEST_INFO Datenstruktur und CryptSignAndEncodeCertificate Funktion, die mit X509_CERT_REQUEST_TO_BE_SIGNED Parameter verwendet werden kann. Theoretisch ist es natürlich möglich, die Anforderung manuell in Bezug auf AsnEncodedData zu codieren, da CSR nicht komplex ist (siehe http://en.wikipedia.org/wiki/Certificate_signing_request und http://www.rfc-editor.org/rfc/rfc2311.txt), aber ich denke nicht, dass es Sinn macht, wenn in CryptoAPI bereits eine Implementierung existiert.

Ein gutes Beispiel zum Erstellen von CSR in Bezug auf CryptoAPI finden Sie in http://msdn.microsoft.com/en-us/library/aa382364(VS.85).aspx und http://msdn.microsoft.com/en-us/library/ms867026.aspx.

-1

Ich hatte das gleiche Problem. Ich habe keine Lösung gefunden, die auf einer Arbeit so "erfunden" wurde. CertUtil.exe ist das Befehlszeilenprogramm von Microsoft zum Erstellen, Lesen, Übermitteln, Akzeptieren und Installieren von Zertifikaten. Ich habe System.Diagnostics.Process verwendet, um einen externen Prozess zu erstellen, und die CSR-Anforderungsdatei als Argument übergeben, um die Datei in einem Stream zu lesen. Heres der Code dafür.

using (System.Diagnostics.Process extProc = new System.Diagnostics.Process()) 
{ 
     extProc.StartInfo.CreateNoWindow = true; 
     extProc.StartInfo.UseShellExecute = false; 
     extProc.StartInfo.RedirectStandardOutput = true; 

     extProc.StartInfo.FileName = @"C:\certtest\Util_xpVersion\certutil.exe"; 
     extProc.StartInfo.Arguments = "-dump \"C:\\certtest\\Util_xpVersion\\ToolCSR.crq\""; 

     extProc.Start(); 
     extProc.WaitForExit(); 
     string sTemp = extProc.StandardOutput.ReadToEnd(); 
     extProc.Close(); 
} 
+0

Das Problem hier ist, dass Sie kein C# -Objekt von Ihrem Programm zu arbeiten bekommen. Außerdem ist es sicher möglich, einen externen Prozess zu starten, um den CSR zu parsen, aber es fühlt sich ein wenig peinlich an. –

15

Es gibt einen Weg, die CertEnroll-Bibliothek, die mit Windows geliefert wird (obwohl ich nicht sagen kann, wie weit zurück gibt es gewesen ist) können Sie Zertifikatsanforderungen laden und sie analysiert.

Zuerst müssen Sie einen Verweis auf die COM-Bibliothek CERTENROLLLib in Ihr Projekt importieren. Dadurch wird ein CERTENROLLLib Namensraum erstellt, den Sie dann verwenden können.

Dann machen Sie so etwas;

string csr = "-----BEGIN CERTIFICATE REQUEST-----\r\n" + 
      "MIIBnTCCAQYCAQAwXTELMAkGA1UEBhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRvMRIw\r\n" + 
      "EAYDVQQDEwlsb2NhbGhvc3QxJzAlBgkqhkiG9w0BCQEWGGFkbWluQHNlcnZlci5l\r\n" + 
      "eGFtcGxlLmRvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAr1nYY1Qrll1r\r\n" + 
      "uB/FqlCRrr5nvupdIN+3wF7q915tvEQoc74bnu6b8IbbGRMhzdzmvQ4SzFfVEAuM\r\n" + 
      "MuTHeybPq5th7YDrTNizKKxOBnqE2KYuX9X22A1Kh49soJJFg6kPb9MUgiZBiMlv\r\n" + 
      "tb7K3CHfgw5WagWnLl8Lb+ccvKZZl+8CAwEAAaAAMA0GCSqGSIb3DQEBBAUAA4GB\r\n" + 
      "AHpoRp5YS55CZpy+wdigQEwjL/wSluvo+WjtpvP0YoBMJu4VMKeZi405R7o8oEwi\r\n" + 
      "PdlrrliKNknFmHKIaCKTLRcU59ScA6ADEIWUzqmUzP5Cs6jrSRo3NKfg1bd09D1K\r\n" + 
      "9rsQkRc9Urv9mRBIsredGnYECNeRaK5R1yzpOowninXC\r" + 
      "-----END CERTIFICATE REQUEST-----"; 

CX509CertificateRequestPkcs10 request = new CX509CertificateRequestPkcs10(); 
request.InitializeDecode(csr, EncodingType.XCN_CRYPT_STRING_BASE64_ANY); 
request.CheckSignature(); 

Console.WriteLine(((CX500DistinguishedName)request.Subject).Name); 
Console.WriteLine(request.PublicKey.Length); 
Console.WriteLine(request.HashAlgorithm.FriendlyName); 

können Sie sehen, die nur Spaß Teil der Subjektname aus wird immer, wie Sie es zu einem CX500DistinguishedName Instanz zuerst werfen müssen.

+1

(Ich würde liebend gerne wissen, warum dies abgelehnt wurde - es ist genau, es funktioniert und benötigt keine Bibliotheken von Drittanbietern) – blowdart

+0

Ich stimme zu - das funktioniert wunderbar. +1. – KenD

0

Betrachten Sie BouncyCastle's C# implementation. Benutzte es für PGP Sachen in der Vergangenheit, hat super funktioniert.

var textReader = File.OpenText(...); 
var reader = new Org.BouncyCastle.OpenSsl.PEMReader(textReader); 
var req = reader.ReadObject() as Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest; 
var info = req.GetCertificationRequestInfo(); 
Console.WriteLine(info.Subject); 
1

Dies ist, wie Sie es tun mit OpenSSL.NET Bibliothek:

// Load the CSR file 
var csr = new X509Request(BIO.File("C:/temp/test.csr", "r")); 
OR 
var csr = new X509Request(@"-----BEGIN CERTIFICATE REQUEST-----..."); 

// Read CSR file properties 
Console.WriteLine(csr.PublicKey.GetRSA().PublicKeyAsPEM); 
Console.WriteLine(csr.Subject.SerialNumber); 
Console.WriteLine(csr.Subject.Organization); 
. 
. 
. 

X509Request Typ hat Eigenschaften, um alles aus Ihrer CSR-Datei Text So etwas sollte man (nicht getestet) beginnen.