Cómo firmar documentos PDF con firma digital de Costa Rica con software libre

La Política de Formatos Oficiales de los Documentos Electrónicos Firmados Digitalmente de Costa Rica especifica el tipo de documentos y su formato de firma digital. En el caso de PDF se utiliza un estándar especificado en Europa para firma digital avanzada (AdES) y en el caso de los PDF se llama PAdES. En el documento oficial enlazado previamente se muestra que tiene que soportar PAdES-LTV (permite la validación de forma longeva) y sugiere que se use el perfil Baseline. El asunto es que no hay mucho software libre en el mercado que permita la firma digital avanzada en PDF, sin embargo la propia Comisión Europea tiene un proyecto para ello (Digital Signature Services), que es un conjunto de librerías y herramientas en Java que permiten trabajar con firma digital con los estándares europeos, incluyendo soporte para PDF.

Hasta no hace mucho tiempo, una de las pocas implementaciones libres para trabajar con firma digital avanzada en PDF era iText, sin embargo este proyecto cambió de licencia y las condiciones de uso contradecían la propia licencia, además de presuntas incompatibilidades en contribuciones del código por parte de terceros que la hacían incompatible con la nueva licencia. Afortunadamente, el proyecto DSS (usando Apache PDFBox como alternativa a iText) permite firmar documentos PDF cumpliendo con la política de formatos oficiales nacional.

Instalación en GNU/Linux

Existe un firmador en formato independiente que funciona en el escritorio. Se puede descargar DSS standalone app package 4.7 RC2 (este es el más reciente en el momento de escribir esta entrada de blog).

Una vez descargado, descomprimir el tarball, contendrá dss-app.jar y un par de scripts para lanzar el jar de forma sencilla. El firmador que hay dentro del jar utiliza por defecto un servidor TSA europeo, para cambiarlo habrá que modificar un fichero que hay dentro del jar en la ruta spring/applicationContext.xml y buscar el texto: http://tsa.belgium.be/connect para reemplazarlo por el siguiente: http://tsa.sinpe.fi.cr/tsahttp/ y guardarlo modificado con este cambio dentro del archivo jar (un archivo jar es un archivo zip realmente).

Para poder ejecutar este jar en GNU/Linux se necesita el entorno JRE de OpenJDK 8 y además OpenJFX 8 (JavaFX). En Ubuntu se puede instalar con sudo apt install openjfx y en Fedora mediante un repositorio COPR de terceros con sudo dnf copr enable lenticularis/AVRConfig y luego sudo dnf install openjfx.

Una vez instaladas las dependencias de Java, se puede ejecutar desde la terminal en la carpeta donde se haya descomprimido con sh dss-run.sh o bien con java -jar dss-app.jar.

Aparecerá una ventana como la siguiente:
Firmador DSS configurado

Firmado de un documento PDF

En fichero a firmar (File to sign) se selecciona el documento PDF que se desea firmar digitalmente.

En formato de firma (Signature format) se debe elegir PAdES porque se trata de un PDF.

En PAdES solamente existe el formato envuelto (Enveloped), por lo que este campo lo selecciona automáticamente.

En el nivel (Level) se elige el nivel de perfil de PAdES. PAdES-BASELINE-LTA es el equivalente a PAdES-LTV.

En algoritmo de resumen hash encriptado (Digest algorithm) se recomienda que sea como mínimo de tipo SHA-2, en la imagen de ejemplo se ha seleccionado SHA-512.

En Signature token API se tiene que seleccionar PKCS #11, entonces se desplegará PKCS #11 library donde hay que especificar dónde está la librería del módulo de Firma Digital (libASEP11.so).

En contraseña (Password) se ingresa el PIN de la tarjeta de Firma Digital.

Cuando se presione sobre Sign se iniciará el proceso de firmado y tras unos segundos aparecerá una ventana para guardar el PDF generado en la ubicación que se desee.

Eso es todo. El documento PDF ya tiene una firma válida en el país.

Demostración de documento válido generado

Esta imagen muestra que la firma generada es válida en la aplicación Acrobat Reader DC:

Validando firma en Adobe Reader

Existen formas de validar la firma del documento PDF con software libre (para no tener que usar Acrobat Reader DC como en este ejemplo), pero se explicará en próximas entradas de blog.

Aunque este firmador no tiene campo de estampa visible (“firma visible”), la política de documento oficial no indica que el documento requiera disponer este detalle visual en los PDF.

“Cómo firmar documentos PDF con firma digital de Costa Rica con software libre” tiene una respuesta

  1. Jonathan Vargas

    Es bueno saber que el proyecto usa JavaFX, nosotros vamos en esa misma línea para olvidarnos de SWT, vos recordarás bien el difícil mantenimiento que implicaba para diversos sistemas, además de los problemas con los componentes de visualización disponibles.

    Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada.