¡Esta es una revisión vieja del documento!
Tabla de Contenidos
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.
