CryptoApplet


La Universitat Jaume I de Castellón ha liberado el código de CryptoApplet, un applet para la realización de firma digital avanzada en el lado del cliente a través de un navegador (Internet Explorer y navegadores de la familia mozilla bajo Linux y Windows) accediendo de forma correcta a cada almacen de certificados, ya sea local o a través de un dispositivo externo (como en el caso del DNI-e).

Este applet es capaz de generar firmas y ofrecer su representación en PKCS#1, PKCS#7, XMLDsig, XAdES-X-L (JDigiDoc de OpenXAdES), PDF y PDF con sello de tiempo.

Todo el código del applet se ha liberado bajo GPLv2 y puede descargarse en:

http://proyectostic.uji.es/cryptoapplet/index_es.html

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