2010-05-13 21 views
6

Quiero leer el contenido de una csr en C#, sin embargo, no he encontrado ninguna forma de hacerlo en C#. Lo que he encontrado es el espacio de nombres System.Security.Cryptography.X509Certificates, pero solo maneja los certificados existentes, no las solicitudes de certificado:/Lectura de una solicitud de firma de certificado con C#

¿Alguien puede darme una pista al respecto? Gracias de antemano.

Jorge

+1

No tengo ninguna experiencia con él, pero eche un vistazo a Bouncy Castle API. La implementación de Java lee los CSR, y se supone que la implementación de C# proporciona la "mayoría" de la funcionalidad de Java. http://www.bouncycastle.org/csharp/ –

Respuesta

0

Me parece la mejor manera para que usted es el uso no administrado CryptoAPI o P/Invoke. CryptoAPI tiene la estructura de datos CERT_REQUEST_INFO y la función CryptSignAndEncodeCertificate que se puede usar con el parámetro X509_CERT_REQUEST_TO_BE_SIGNED. En teoría, es posible codificar la solicitud manualmente con respecto a AsnEncodedData, porque CSR no es complejo (consulte http://en.wikipedia.org/wiki/Certificate_signing_request y http://www.rfc-editor.org/rfc/rfc2311.txt), pero no creo que tenga sentido si ya existe una implementación en CryptoAPI.

Un buen ejemplo para crear CSR con respecto a CryptoAPI lo encontrará en http://msdn.microsoft.com/en-us/library/aa382364(VS.85).aspx y http://msdn.microsoft.com/en-us/library/ms867026.aspx.

-1

Tuve el mismo problema. No encontré una solución tan "inventada";) en un trabajo alternativo. CertUtil.exe es la utilidad de línea de comandos de Microsoft para crear, leer, enviar, aceptar e instalar certs. Utilicé System.Diagnostics.Process para crear un proceso externo y pasé el archivo de solicitud de CSR como argumento para leer el archivo en una secuencia. Aquí está el código para eso.

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

El problema aquí es que no obtienes ningún objeto C# para trabajar desde tu programa. Además, comenzar un proceso externo para analizar la CSR es seguramente posible, pero se siente un poco incómodo. –

15

Hay camino, la biblioteca CertEnroll que viene con Windows (aunque no puedo decir que tan atrás que ha estado ahí) le permite cargar las solicitudes de certificado y hacer que se analizan.

Primero debe importar una referencia a la biblioteca COM CERTENROLLLib en su proyecto. Esto creará un espacio de nombre CERTENROLLLib que luego podrá usar.

Luego haces algo como esto;

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

se puede ver la parte única diversión es llegar el nombre del sujeto a cabo, ya que necesita para su emisión a una instancia CX500DistinguishedName primero.

+1

(Me encantaría saber por qué se votó en contra: es correcto, funciona, y no necesita bibliotecas de terceros) – blowdart

+0

Estoy de acuerdo, esto funciona muy bien. +1. – KenD

0

Mire BouncyCastle's C# implementation. Lo usé para cosas de PGP en el pasado, funcionó de maravilla. Algo como esto debería ayudarle a empezar (no probado):

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

Esta es la forma en que lo hace con OpenSSL.NET biblioteca:

// 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 tipo tiene propiedades para obtener todo de su texto archivo CSR.

Cuestiones relacionadas