¿Cómo recuperar un certificado con X509Certificates?

26 Feb

Los certificados son archivos que nos ayudan a proteger un fichero y evitar así que puedan ser modificados por terceras personas o máquinas que puedan suplantarnos.

En este ejemplo intento mostrar como recuperar un certificado de una colección o almacén de certificados y firmar un array de byte.

Requisitos X509Certificates y iTextSharp.

Para este ejemplo tendréis que incorporar la siguiente librería.

using System.Security.Cryptography.X509Certificates;
using iTextSharp.text.pdf;



//Firmar: Protege el fichero recibido byte[] con la Firma recibida.
//pdf: Array de byte
//firma: string que identificará el certificado, del tipo a: "C=ES, CN=UnTexto, O= más texto, SERIALNUMBER=un código, OU=más texto, G=Texto, SN=texto, Description=más texto"

public byte[] Firmar(byte[] pdf, string firma){


// Obtención del certificado
// Definimos un almacén de certificados, en este caso he utilizado el mío, StoreLocation.CurrentUser, aunque se puede usar StoreLocation.LocalMachine

X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
// Abrimos el almacén de certificados.
store.Open(OpenFlags.ReadOnly);
// Recuperamos los certificados del almacén.
X509Certificate2Collection Certificados1 = (X509Certificate2Collection)store.Certificates;
// Recuperamos los certificados vigentes.
X509Certificate2Collection Certificados2 = Certificados1.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
// Buscamos el certificado
X509Certificate2Collection Certificados3 = Certificados2.Find(X509FindType.FindBySubjectName, firma, false);
X509Certificate2 miCert = null;
// Si encontramos un certificado disponible usamos el primero
if (Certificados3 != null && Certificados3.Count != 0)
miCert = Certificados3[0];
// Cerramos el almacén de certificados
store.Close();
//Si no encuentra el certificado, lanza una excepción ya que no puede continuar el proceso.
if (miCert == null) {
throw new Exception (“No existe la firma”);
}
//Asignamos el certificado al pdf
Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(miCert.RawData) };
iTextSharp.text.pdf.security.IExternalSignature externalSignature = new iTextSharp.text.pdf.security.X509Certificate2Signature(miCert, “SHA-1”) ;
PdfReader pdfReader = new PdfReader(pdf);
//Creamos un MemoryStream para almacenar el pdf recibido + la firma.
MemoryStream memStream = new MemoryStream();
PdfStamper pdfStamper = PdfStamper.CreateSignature(pdfReader, memStream, ‘\0′);
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;
// Establecemos la firma
signatureAppearance.Reason = “Razón del firmado”;
signatureAppearance.Location = “Localización”;
signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION;
signatureAppearance.SignDate = DateTime.Now;
iTextSharp.text.pdf.security.MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, iTextSharp.text.pdf.security.CryptoStandard.CMS);
//Devolvemos el array de byte del documento resultante.
return memStream.ToArray();
}

Anuncios

Una respuesta to “¿Cómo recuperar un certificado con X509Certificates?”

Trackbacks/Pingbacks

  1. C#, ¿qué ? y ¿cómo ? | Javier De Usera R. - marzo 2, 2015

    […] ¿Cómo recuperar un certificado con X509Certificates? […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

La que has liado

Fotografiar con palabras, nuestro momento, nuestra época. Del 1.1 al 2.0

TERZERO

Pio Baroja

El árbol inútil

Blog de cuentos, libros y mala poesía

Lo que de verdad importa

somos dueños de nuestro destino, inventores de nuestro futuro y nuestra felicidad...

Frikstation

Pasión por el mundo de la televisión, el cine, los videojuegos y su merchandising.

A %d blogueros les gusta esto: