Firmar PDF con firma visible mediante Autofirma desde terminal en Linux.

Dada la escasa documentación existente de como firmar un documento con Autofirma y que la firma sea visible, añado un script que lo consigue.

1- Consideraciones previas

Queriendo firmar documentos PDF desde la línea de comandos, hay varios blogs que lo explican muy bien y que aconsejo su lectura antes de utilizar este script:

2- Identificación del problema

Firmar un documento siguiendo las páginas anteriormente citadas no fue difícil. El problema viene cuando quieres que la firma sea visible en el documento.

Los principales problemas son los siguientes:

Los espacios dentro de los parámetros

Cuando visualizamos la ayuda de AutoFirma, nos dice lo siguiente:

AutoFirma sign -help
Sintaxis: AutoFirma sign [options...]

options

-gui (Realiza la operacion con entorno grafico. Tiene prioridad sobre -certgui)
-certgui (Usa un dialogo grafico para la seleccion del certificado de firma)
-i inputfile (Ruta del fichero de entrada)
-o outputfile (Ruta del fichero de salida)
-algorithm algo (Algoritmo de firma)
-format (Establece el formato de firma)
auto (Seleccion de formato en base al fichero de entrada)
cades (Formato CAdES)
pades (Formato PAdES)
xades (Formato XAdES)
facturae (Firma de factura electronica)
ooxml (Formato OOXML)
odf (Formato ODF)
-config extraParams (Properties en texto plano con la configuracion de la operacion)
-store (Establece el almacen de claves. Por defecto, el del sistema)
auto (Almacen de claves del sistema)
windows (Almacen de claves de Windows)
mac (Almacen de claves de Mac OS X)
mozilla (Almacen de claves de Mozilla Firefox)
dni (DNI electronico)
pkcs12:p12file (Almacen PKCS#12. "p12file" es la ruta del almacen)
pkcs11:p11file (Almacen PKCS#11. "p11file" es la ruta del controlador)
-password password (Establece la contrasena del almacen)
-alias alias (Alias del certificado de firma)
-filter filter (Filtro para seleccionar el certificado de firma)
-xml (Formatea la respuesta como XML)

Parece sencillo, solo tienes que rellenar los parámetros necesarios y listo. Nada más lejos de la realidad. Si uno intenta poner un espacio dentro de algún parámetro saltan errores por todas partes. Aunque lo intentes pasar dentro de comillas simples, comillas dobles, con el caracter de espacio mediante secuencia de escape, etc… Probablemente haya otra solución pero la que encontré que funciona es pasando los parámetros directamente al .jar, llamando a:

java -jar /usr/lib/AutoFirma/AutoFirma.jar

en vez de al programa /usr/bin/Autofirma que no es más que un bash que ejecuta la orden anterior. A lo mejor modificando ese script se soluciona pero no he querido tocarlo.

Escasa o nula información de como pasar parámetros con -config

Para conseguir visualizar la firma, es necesario pasar parámetros con -config (lo he señalado arriba en rojo en la ayuda). Ha sido un infierno hasta descubrir que dichos parámetros tienen que se pasados separados por un \n (secuencia de escape de nueva línea). La documentación sobre qué parámetros usar es relativamente fácil encontrarla en pdfs pero esto del \n no está en ningún sitio o por lo menos yo no lo he encontrado.

Por tanto, si queremos mandar los parámetros por -config debe ser así:

-config "signaturePositionOnPageLowerLeftX=40\n
signaturePositionOnPageLowerLeftY=15\n
layer2FontColor=darkGray"

3- Vamos a por el script

Viendo esas consideraciones previas suelto aquí el script:

Debes cambiar la ruta del archivo de firma y la contraseña de acceso.

#!/bin/bash
STORE="pkcs12:./Firma.p12" # Ruta del archivo de firma digital FNMT (Cambiar)
PASSWORD="XXXXXXXXX" # Contraseña del archivo de firma digital (Cambiar)
FORMAT="pades" # Formato para firma de pdfs
LAYER2TEXT='Firmado digitalmente por $SUBJECTCN$ el día $SIGNDATE=dd/MM/yyyy$ con un certificado emitido por $ISSUERCN$' # Texto que queremos que aparezca firma
PositionOnPageLowerLeftX='40' # Coordenada X Abajo Izquierda
PositionOnPageLowerLeftY='15' # Coordenada Y Abajo Izquierda
PositionOnPageUpperRightX='275' # Coordenada X Arriba Derecha
PositionOnPageUpperRightY='54' # Coordenada Y Arriba Derecha
l2FontColor='darkGray' # Color de letra
l2FontSize='8' # Tamaño de letra
sPage='-1' # Página donde firmaremos -1=última
l2FontFamily='0' # Familia de fuente (Courier)
l2FontStyle='0' # Estilo de Fuente

ALIASES=$(/usr/bin/AutoFirma listaliases -store $STORE -password $PASSWORD)

CONFIG="layer2Text=$LAYER2TEXT\n\
signaturePositionOnPageLowerLeftX=$PositionOnPageLowerLeftX\n\
signaturePositionOnPageLowerLeftY=$PositionOnPageLowerLeftY\n\
layer2FontColor=$l2FontColor\n\
signaturePositionOnPageUpperRightX=$PositionOnPageUpperRightX\n\
signaturePositionOnPageUpperRightY=$PositionOnPageUpperRightY\n\
layer2FontSize=$l2FontSize\n\
signaturePage=$sPage\n\
layer2FontFamily=$l2FontFamily\n\
layer2FontStyle=$l2FontStyle"

java -jar /usr/lib/AutoFirma/AutoFirma.jar sign -i "$1" -o "${1/.pdf/}_signed.pdf" \
-store $STORE \
-password $PASSWORD \
-alias $ALIASES \
-format $FORMAT \
-config "$CONFIG"

Para modificar la posición puedes guiarte con la siguiente imagen:

Importante: En caso de querer añadir una imagen, esta debe ser jpg y codificarse en base64. Se ha de añadir como un parámetro al config llamado signatureRubricImage que deberás terminar con un \n en caso de meterlo en medio del config.

4. Ejecutándo el script.

Depués de guardar el script y darle permisos de ejecución lo ejecutaremos pasándole como parámetro el nombre y ruta del archivo pdf a firmar. Al archivo firmado le añadirá en el nombre la coleta _signed.

En caso de querer que no se guarde la contraseña dentro del script y que la pida cada vez que queremos firmar, podemos hacer lo siguiente:

Comentamos la línea que dice PASSWORD="XXXXXXXXX" y  añadimos al comienzo del script las siguientes líneas:

echo -n Password: 
read -s PASSWORD
echo



Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *