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

Google+ photo

Estás comentando usando tu cuenta de Google+. 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 )

Conectando a %s

La que has liado

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

TERZERO

Pio Baroja

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.

MY KHABAROVSK EXPERIENCE

La historia de mi vida en la ciudad de Khabarovsk (Rusia) en el Lejano Oriente - A tale of my life in the Far East city of Khabarovsk (Russia)

A %d blogueros les gusta esto: