2010-05-13 36 views
6

Je souhaite lire le contenu d'un fichier csr en C#, mais je n'ai trouvé aucun moyen de le faire en C#. Ce que j'ai trouvé était l'espace de noms System.Security.Cryptography.X509Certificates, mais il ne gère que les certificats existants, pas les demandes de certificat:/Lecture d'une demande de signature de certificat avec C#

Quelqu'un peut-il me donner un indice? Merci d'avance.

Jorge

+1

Je n'en ai aucune expérience, mais jetez un œil à l'API Bouncy Castle. L'implémentation Java lit les CSR et l'implémentation C# est censée fournir «la plupart» des fonctionnalités Java. http://www.bouncycastle.org/csharp/ –

Répondre

0

Il me semble que la meilleure façon pour vous est l'utilisation CryptoAPI non géré ou P/Invoke. CryptoAPI a CERT_REQUEST_INFO structure de données et CryptSignAndEncodeCertificate fonction qui peut être utilisée avec X509_CERT_REQUEST_TO_BE_SIGNED paramètre. En théorie, il est possible d'encoder la requête manuellement en respectant AsnEncodedData, car la RSC n'est pas complexe (voir http://en.wikipedia.org/wiki/Certificate_signing_request et http://www.rfc-editor.org/rfc/rfc2311.txt), mais je ne pense pas que cela ait un sens si une implémentation existe déjà dans CryptoAPI.

Un bon exemple pour créer CSR en ce qui concerne CryptoAPI vous trouverez dans http://msdn.microsoft.com/en-us/library/aa382364(VS.85).aspx et http://msdn.microsoft.com/en-us/library/ms867026.aspx.

-1

J'ai eu le même problème. Je n'ai pas trouvé une solution si "inventée";) sur un travail autour. CertUtil.exe est l'utilitaire de ligne de commande de Microsoft pour créer, lire, soumettre, accepter et installer des certificats. J'ai utilisé System.Diagnostics.Process pour créer un processus externe et transmis le fichier de requête CSR en tant qu'argument pour lire le fichier dans un flux. Heres le code pour cela.

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

Le problème ici est que vous ne recevez aucun objet C# à partir de votre programme. De plus, démarrer un processus externe pour analyser le CSR est sûrement possible mais cela semble un peu gênant. –

15

Il y a une certaine façon, la bibliothèque CertEnroll qui vient avec Windows (bien que je ne peux pas dire à quel point il a été de retour là-bas) vous permet de charger des demandes de certificats et les ont analysés.

Vous devez d'abord importer une référence à la bibliothèque COM CERTENROLLLib dans votre projet. Cela créera un espace de nom CERTENROLLLib que vous pourrez ensuite utiliser.

Ensuite, vous faites quelque chose comme ça;

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); 

Vous pouvez voir la seule partie de plaisir est d'obtenir le nom du sujet, comme vous devez le jeter à un CX500DistinguishedName exemple d'abord.

+1

(J'aimerais beaucoup savoir pourquoi cela a été rejeté - c'est précis, cela fonctionne, et n'a pas besoin de bibliothèques tierces) – blowdart

+0

Je suis d'accord - cela fonctionne à merveille. +1 – KenD

0

Regardez BouncyCastle's C# implementation. Utilisé pour les trucs PGP dans le passé, a bien fonctionné. Quelque chose comme cela devrait vous aider à démarrer (non testé):

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

Voici comment vous le faites avec OpenSSL.NET bibliothèque:

Type
// 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 a des propriétés pour obtenir tout de votre fichier texte CSR.