Herramientas de usuario

Herramientas del sitio


informatica:software:autofirma

¡Esta es una revisión vieja del documento!


AutoFirma

Aplicación de firma electrónica desarrollada por el Ministerio de Asuntos Económicos y Transformación Digital de España. Al poder ser ejecutada desde el navegador, permite la firma en páginas de Administración Electrónica cuando se requiere la firma en un procedimiento administrativo. También se puede usar desde como aplicación independiente.

Con el programa AutoFirma puedes firmar documentos PDF, Word, Excel o PowerPoint mediante certificado digital.

Disponible para los siguientes sistemas operativos:

  • Windows 7 o superior.
  • macOS 10.11 o superior.
  • Linux (kernel 2.6 o superior).

Instalación

Arch Linux

Paquete autofirma-bin.

Uso

Firma en línea de comandos

Probado para la versión 1.8.3 bajo Arch Linux:

autofirma sign -i documento.pdf -o documento_firmado.pdf -store pkcs12:/ruta/a/certificado_digital.p12 -filter subject.contains:<IDENTIFICADOR> -password <CONTRASEÑA_CERTIFICADO>

Para saber qué poner en la opción -filter, podemos usar openssl para ver los datos del certificado:

openssl pkcs12 -nokeys -info -in certificado-digital.p12 | grep -i subject

Por ejemplo, podríamos poner el DNI:

autofirma sign -i documento.pdf -o documento_firmado.pdf -store pkcs12:/ruta/a/certificado_digital.p12 -filter subject.contains:12345678Z -password <CONTRASEÑA_CERTIFICADO>

También podríamos buscar ese identificador utilizando keytool y fijándonos en lo que aparece en la sección Nombre de Alias:

keytool -list -v -keystore <certificado-digital.p12> | grep Alias

Ejemplo de salida:

Nombre de Alias: rodriguez_perez_manuel___12345678z

Otra forma de encontrar el lias es pasándole la opción listaliases a autofirma:

autofirma listaliases -store pkcs12:certificado-digital.p12

Si conocemos el alias del certificado que queremos usar, en lugar de la opción -filter podemos usar la opción -alias:

autofirma sign -i documento.pdf -o documento_firmado.pdf -store pkcs12:/ruta/a/certificado_digital.p12 -alias rodriguez_perez_manuel___12345678z -password <CONTRASEÑA_CERTIFICADO>

Script de bash:

#!/bin/bash
#
# Script para firmar documentos usando AutoFirma
#
# Joaquín Ferrero. 2022.11.08
# Joaquín Ferrero. 2021.03.06
#
# Ejecutar:
#   Pasar el documento PDF a firmar como parámetro.
#   El resultado es otro documento con una coletilla en el nombre.
#
#    ~/bin/firma_generica.sh Factura_EMPRESA_2022_0534117.pdf
#
# Personalización básica:
# * NIF
# * Nombre del archivo .p12 con la firma digital.
# * Contraseña para acceder a ese archivo.
# * Posición de la firma en la página.
#       Se usa el truco de hacerlo primero con AutoFirma y luego
#       ver qué valores utiliza mirando el final del archivo AUTOFIRMA.afirma.log.xml.
# * Imagen de una firma digitalizada. Opcional.
#       El mismo truco que el anterior.
# * ERROR: No funciona la plantilla $$LOCATION$$, así que está puesto de forma directa.
# * Como no me gustaba el texto por defecto de $$ISSUERCN$$, también lo he puesto directamente.
#
 
# Leemos el nombre del archivo pdf pasado por línea de comandos
ARCHIVO=$1
# Creamos el nombre del archivo resultado
ARCHIVOFIRMADO="${ARCHIVO/%.pdf/_firmado.pdf}"
#ARCHIVOFIRMADO="${ARCHIVO%.pdf}_firmado.pdf"    # método alternativo por si falla el anterior
 
### Personalización #######################################################################################
NIF="B47455891"                                 # NIF
DIR='/home/usuario/Documentos/Empresa'          # Ruta al dir. de trabajo
STORE="pkcs12:$DIR/Hacienda/$NIF.p12"           # Ruta al almacén del certificado digital P12
PASSWORD="CONTRASEÑA"                           # Contraseña del archivo de la firma digital
LOCATION="Valladolid"                           # Lugar donde se firma
ISSUERCN="FNMT-RCM"                             # Emisor del certificado
 
JAVADIR="/usr/lib/java/jdk-11.0.2/bin"          # Ruta al motor Java, si fuera necesario
AUTOFIRMA="/usr/lib/AutoFirma/AutoFirma.jar"    # Ruta al AutoFirma.jar
 
# Personalizacion de la salida
FORMAT="pades"                                  # Formato para firma de pdf
 
# Posición de la firma visible
PositionOnPageLowerLeftX='350'                  # Coordenada X Abajo Izquierda
PositionOnPageLowerLeftY='85'                   # Coordenada Y Abajo Izquierda
PositionOnPageUpperRightX='550'                 # Coordenada X Arriba Derecha
PositionOnPageUpperRightY='195'                 # Coordenada Y Arriba Derecha
 
# Fuente de letras
l2FontColor='black'                             # Color de letra
l2FontSize='7'                                  # Tamaño de letra
l2FontFamily='1'                                # Familia de fuente
l2FontStyle='0'                                 # Estilo de Fuente
 
# Página
signaturaPage='1'                               # Página donde firmaremos -1=última
 
# Rúbrica o imagen a añadir, opcional
# Se crea con el comando: base64 -w 0 <archivo> y se copian los datos en base64 en la siguiente variable
#signatureRubricImage='... datos en base64 ...'
# Otra forma: llamar al comando base64 directamente, en todas las ocasiones
signatureRubricImage=$(base64 -w 0 ~/Documentos/Empresa/Firmas/FIRMA_DEL_TESORERO.jpg)
 
# Personalización de la firma visible en el documento
# Estos son campos que AutoFirma rellenerá
# $$SUBJECTCN$$ Nombre común (CN, Common Name) del titular del certificado de firma
# $$ISSUERCN$$ Nombre común (CN, Common Name) del emisor del certificado de firma
# $$CERTSERIAL$$ Número de serie del certificado de firma
# $$SIGNDATE=PATRÓN$$ Fecha de la firma
# $$GIVENNAME$$ Nombre del titular (G, Given Name) (podría estar vacío)
# $$SURNAME$$ Apellidos del titular (SN, Surname) (podría estar vacío)
# $$ORGANIZATION$$ Organización (O, Organization) (podría estar vacío)
# $$REASON$$ Razón por la que se firma el PDF. (podría estar vacío)
# $$LOCATION$$ Ciudad en la que se firma el PDF. (podría estar vacío)
# $$CONTACT$$ Información de contacto del firmante del PDF. (podría estar vacío)
 
# Formato del campo de la fecha:
# https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html
#FECHA="EEEE d 'de' MMMM 'de' yyyy, HH:mm:ss"
FECHA="d 'de' MMMM 'de' yyyy, HH:mm:ss"
 
# Texto que queremos que aparezca en la firma
# Este es un texto libre, pero debe entrecomillarse con comillas simples, ya que contiene caracteres '$'
LAYER2TEXT='En '$LOCATION', el $$SIGNDATE='$FECHA'$$
 
 
 
 
 
 
 
 
 
 
 
Firma digital de $$GIVENNAME$$ $$SURNAME$$
          Certificado emitido por '$ISSUERCN' para
$$ORGANIZATION$$'
 
# Configuración que espera AutoFirma
CONFIG="layer2Text=$LAYER2TEXT\n\
    signaturePositionOnPageLowerLeftX=$PositionOnPageLowerLeftX\n\
    signaturePositionOnPageLowerLeftY=$PositionOnPageLowerLeftY\n\
    signaturePositionOnPageUpperRightX=$PositionOnPageUpperRightX\n\
    signaturePositionOnPageUpperRightY=$PositionOnPageUpperRightY\n\
    layer2FontColor=$l2FontColor\n\
    layer2FontSize=$l2FontSize\n\
    layer2FontFamily=$l2FontFamily\n\
    layer2FontStyle=$l2FontStyle\n\
    signatureRubricImage=$signatureRubricImage\n\
    signaturePage=$signaturaPage"
 
### Fin de la personalización #############################################################################
 
# Aquí se hace la firma
# Se puede hacer de varias maneras. Aquí hay dos que he encontrado.
# Escoger aquella que mejor se ajuste al contenido del almacén, y comentar las líneas de la otra solución.
 
# 1º, con -filter, poner algo que esté dentro del certificado, por ejemplo, el NIF
 
$JAVADIR/java -jar $AUTOFIRMA sign      \
    -i "$ARCHIVO"                       \
    -o "$ARCHIVOFIRMADO"                \
    -store $STORE                       \
    -format $FORMAT                     \
    -password $PASSWORD                 \
    -filter subject.contains:$NIF       \
    -config "$CONFIG"
 
echo ""
exit
 
# 2º, con -alias, para encontrar el certificado dentro del almacén .p12
# primero llamamos a AutoFirma para pedir los alias de un determinado almacén
ALIASES=$($JAVADIR/java -jar $AUTOFIRMA listaliases -store $STORE -password $PASSWORD)
 
$JAVADIR/java -jar $AUTOFIRMA sign      \
    -i "$ARCHIVO"                       \
    -o "$ARCHIVOFIRMADO"                \
    -store $STORE                       \
    -format $FORMAT                     \
    -password $PASSWORD                 \
    -alias "$ALIASES"                   \
    -config "$CONFIG"
 
echo ""
exit
 
# FIN de firma.sh

Firma visible en el documento

Con la firma digital se firma el fichero completo y se añade la firma en los metadatos por lo que no es necesario lo de firmar todas las páginas. Es cierto que Autofirma permite hacer visible en el PDF un “testigo” de la firma, pero lo importante no es eso si no los metadatos.

Validar / verificar firma

Recursos

informatica/software/autofirma.1745052051.txt.gz · Última modificación: por tempwin