jueves, 9 de octubre de 2008

Firma digital de PDF

Hola, muchas veces para nuestros sistemas debemos resguardar la integridad de los documentos almacenados en nuestros repositorios, ya sean word, pdf u otros.

Esto lo podemos realizar agregando la firma digital a los documentos, y una manera de hacerlo es mediante las apis de Java, las que nos proveen los metodos apropiados para la firma avanzada de documentos PDF.

Avanzada, porque el mismo Acrobar Reader valida la integridad del documento y la firma digital, ademas de agregar la capacidad de usar nuestro propio certificado pfx.

En el siguiente ejemplo veremos como firmar digitalmente un documento PDF.

1.- Debemos contar con algún certificado pfx valido en nuestro sistema.

Si ya contamos con este certificado PKCS12 (. pfx) procedemos con el ejemplo.

primero vamos a nuestro ide eclipse para Java creamos una clase con el siguiente código.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfSignatureAppearance;

public class FirmarPDF {

public static void main (String [] args) throws Exception{
KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream("/home/slack/mycert.pfx"), "quaker77".toCharArray());
String alias = (String) ks.aliases().nextElement();
PrivateKey key = (PrivateKey) ks.getKey(alias, "quaker77".toCharArray());
Certificate[] chain = ks.getCertificateChain(alias);
PdfReader reader = new PdfReader("/home/slack/0X/ccu/documento_inicial_req.pdf");
FileOutputStream fout = new FileOutputStream("/home/slack/compartido/documento_firmado2.pdf");
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0', new File("/tmp"));
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
sap.setReason("Prueba de firma digital con iText");
sap.setLocation("Chile");
sap.setContact("Empresa Chile");
stp.close();
}

}

Debemos contar con las librerias necesarias que se importan en la clase.

En el código vemos que tenemos un archivo pdf de entrada y otro de salida, pero este ultimo va firmado.

La firma digital de documentos PDF la valida Adobe Acrobat, que es capaz de procesar y validar esta información.

Para verificar visualmente que el documento de salida esta firmado vemos las siguientes caracteristicas en el nuevo documento en acrobat reader.



Bueno, este en un ejemplo practico para firmar pdf con Java.

Ahora faltaría agregar esta implementación a una aplicación web para clientes.

Saludos y Suerte !!

5 comentarios:

Leandro Tapia dijo...

Excelente, fácil para comprender y entender... gran aporte slackware.

Anónimo dijo...

Una pregunta...
Y si quisiera validar la firma con Java???

O usar un certificado que no sea PKCS12???

Un saludo

Anónimo dijo...

cuando llega a stp.close(); salta un error, y no se crea el fichero firmado. por que puede ser?

Anónimo dijo...

a mi tb me da el error al llegar a stp.close()

firmando digitalmente pdf dijo...

Bien echo, me gusto tu metodo, pero hasta que lo encontre ya mi compañia empezo a firmar digitalmente de otras maneras.