Integrando la firma digital de documentos PDF con Apache Cocoon

Apache Cocoon es un framework de publicación XML. En Cocoon se define un origen XML (generator), una transformación XSL opcional (transformer) y se obtiene un documento (serializer) en el formato deseado (PDF, RTF, XHTML, Postscript, Excel, etc). Cocooon nos permite olvidarnos de los procesos de transformación de documentos XML, de forma que sólo tenemos que definir los distintos pasos por los que pasará nuestra información origen XML (pipelines).

En esta dirección podemos encontrar información adicional sobre Cocoon.

En un reciente artículo sobre firma digital de documentos PDF con iText veíamos cómo realizar la firma aislada de documentos PDF.
Para los que utilicen Cocoon, existe una forma de poder firmar los documentos PDF que se generen dinámicamente como resultado de una transformación. El proceso pasa por implementar nuestro propio serializer.

Lo que vamos a hacer es implementar una clase que herede de FOPSerializer (encargada de la generación de PDF) y, antes de que se emita el PDF como salida, pasar esta información por el proceso de firma descrito en el artículo anterior.

El resultado es la clase PDFSignSerializer.java que nos permite implementar el proceso.
Esta clase, al ser un nuevo serializer, debe ser definida en el fichero de configuración de Cocoon (sitemap.xmap):

<map:serializer logger="sitemap.serializer.fo2spdf" mime-type="application/pdf" name="fo2spdf"
src="org.apache.cocoon.serialization.PDFSignSerializer"/>

Y luego, ya podemos utilizarla en cualquier pipeline:

<map:match pattern="kk">
<map:generate src="samples/hello-world/content/hello.xml" />
<map:transform src="samples/hello-world/style/xsl/page2fo.xsl" />
<map:serialize type="fo2spdf" />
</map:match>

Firmando documentos PDF con iText

iText es una librería Java gratuita para la generación de documentos PDF de forma dinámica. Es una de las más utilizadas por su simplicidad, disponibilidad de ejemplos y documentación (incluso se ha publicado un libro) y funcionalidades.

A parte del soporte para la generación de documentos PDF, ofrece una serie de características adicionales que pueden resultar muy interesantes:

Respecto a la firma digital, es posible firmar un documento PDF existente con un certificado X509 en formato PKCS#12 (en explorer se exportan como .PFX) de forma directa:


KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream("certificado.pfx"), "mi_password".toCharArray());
String alias = (String) ks.aliases().nextElement();
PrivateKey key = (PrivateKey) ks.getKey(alias, "mi_password".toCharArray());
Certificate[] chain = ks.getCertificateChain(alias);
PdfReader reader = new PdfReader(”documento.pdf”);
FileOutputStream fout = new FileOutputStream(”documento_firmado.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(”Spain”);
sap.setContact(”Ricardo Borillo”);
stp.close();

Hay disponible una descripción más amplia de todo el proceso en esta dirección.

Así es como se vería el documento firmado cundo lo visualizamos con el Acrobat Reader:

Y la información de la firma en la pestaña vertical de la parte izquierda (Firmas):

Extendiendo MediaWiki

MediaWiki, producto que se creó originalmente para dar soporte a la Wikipedia, es uno de los entornos colaborativos de edición de contenidos más utilizados en el mundo del software libre.

Cuando usas de forma intensiva un producto de Wiki como este, se plantean ciertas necesidades a las que MediaWiki no da soporte, como por ejemplo la generación de una versión PDF de uno de los documentos.

Es por ello, que resulta interesante ver como algunos usuarios han dado posibles soluciones a esta carencia. Así, en el blog Megaroot, encontramos el siguiente artículo que nos explica como poder generar PDFs de una forma cómoda y accesible desde el mismo interfaz de MediaWiki, mediante el desarrollo de una extensión.

Esta extensión hace un uso de otras iniciativas como WikiPDF o html2fpdf.