Utilidad de Firma y Sellado de tiempo de PDFs (4.0)

Download OpenAPI specification:Download

INTRODUCCIÓN

Utilidad de línea de comandos (JAR de Java) que permite, de forma rápida y sin programar la parte criptográfica:

  • Añadir sellos de tiempo cualificados a documentos PDF.

  • Firmar documentos PDF con su certificado (P12/PFX) añadiendo además un sello de tiempo.

  • Generar documentos PAdES B-LTA (firma longeva con doble sellado: uno en la propia firma y otro a nivel de documento), pudiendo elegir la Autoridad de Sellado de cada sello.

  • Verificar las firmas y sellos de tiempo existentes en un PDF.

Puede ejecutarse a mano o integrarse desde cualquier lenguaje de programación mediante llamadas de tipo 'exec'. Toda la salida es un único objeto JSON, fácil de procesar desde código.

Descarga de la utilidad: FirmaYSelloDePDFs.zip

REQUERIMIENTOS

  • Java 1.8 o superior: el mismo JAR funciona en Java 8, 11, 17, 21 y 25, en cualquier ordenador o servidor.

  • El fichero del logo fnmt.png suministrado en el ZIP debe estar en el mismo directorio que el JAR ejecutable lofirmo_com.jar (solo se usa si se pinta el recuadro informativo). Si coloca un fichero mensatek.png junto al JAR, se usará como logo del recuadro cuando el sello elegido sea el de MENSATEK.

  • Usuario y contraseña del servicio de Sellado de Tiempo: los encontrará en su panel de usuario, sección Sellado de Tiempo.

FORMA DE USO

java -jar lofirmo_com.jar -fe "entrada.pdf" -fs "salida.pdf" -u "Usuario" -p "Contraseña" [opciones]
Parámetro Obligatorio Descripción
-fe Fichero PDF de entrada, con su path completo
-fs Sí (salvo con -check) Fichero PDF de salida
-u Sí (salvo con -check) Usuario del servicio de Sellado de Tiempo
-p Sí (salvo con -check) Contraseña del servicio de Sellado de Tiempo
-cf No Certificado de firma en formato P12/PFX (activa la firma del PDF, además del sello)
-pcf No Contraseña del certificado de firma
-i No Imagen PNG del logotipo de su empresa para el recuadro de firma
-sello No Autoridad de Sellado a utilizar: mensatek (por defecto) o fnmt
-lta No true genera un PAdES B-LTA (ver sección PAdES B-LTA)
-sellodoc No Con -lta true, Autoridad de Sellado del sello de documento: mensatek o fnmt (por defecto, la misma de -sello)
-check No true verifica las firmas del fichero de entrada (solo requiere -fe)
-r No false desactiva el recuadro informativo del final del documento
-c No Texto de la NOTA del recuadro informativo
-certificado No true certifica el documento impidiendo cambios posteriores (no compatible con -lta)
-formato No texto produce la salida clásica de la versión 3.x en lugar de JSON

ATENCIÓN: si el fichero de entrada ya contiene firmas o sellos, la utilidad no añade el recuadro informativo (al modificar el documento invalidaría las firmas previas): la nueva firma o sello se añaden de forma invisible, respetando las firmas existentes, y se deja constancia en el campo 'avisos' de la respuesta.

SELLOS DE TIEMPO DISPONIBLES

Dispone de dos Autoridades de Sellado con la misma validez legal, ambas con sellos de tiempo cualificados eIDAS:

Sello Parámetro Créditos por sellado
MENSATEK -sello mensatek (por defecto) 1 crédito
FNMT (Fábrica Nacional de Moneda y Timbre) -sello fnmt 2 créditos

Cada sello de tiempo realizado se descuenta de sus créditos: una operación normal realiza un sello; una operación con -lta true realiza dos (el de la firma y el de documento, cada uno según la Autoridad elegida).

Si prefiere integrar el sellado de tiempo directamente en sus aplicaciones (protocolo RFC-3161, sin PDF), consulte la especificación del servicio de Sellado de Tiempo.

SALIDA DEL PROGRAMA

La salida es un único objeto JSON por la salida estándar. El campo 'resultado' vale OK o ERROR y el código de salida del proceso es 0 (OK) o 1 (ERROR).

Ejemplo de operación correcta (firma + sello):


{
  "resultado": "OK",
  "version": "4.0",
  "ficheroEntrada": "/ruta/entrada.pdf",
  "operacion": "firma+sello",
  "ficheroSalida": "/ruta/salida.pdf",
  "sello": "FNMT",
  "lta": false,
  "firmasPrevias": 0,
  "recuadro": true,
  "certificado": false,
  "selloTiempo": {
    "fecha": "01-09-2026 17:00:06",
    "tsa": "C=ES,O=FÁBRICA NACIONAL DE MONEDA Y TIMBRE-REAL CASA DE LA MONEDA,OU=CERES,CN=AUTORIDAD DE SELLADO DE TIEMPO FNMT-RCM - TSU 2020"
  }
}

El campo 'operacion' vale sello, firma+sello o verificacion. Con -lta true se añaden 'selloDocumento' (Autoridad del sello de documento) y 'selloDocumentoTiempo' (fecha y TSA de ese segundo sello). Si hubo circunstancias no fatales (firmas previas, fuentes de revocación no accesibles...), aparecen en el array 'avisos'.

Ejemplo con error (contraseña del certificado incorrecta):


{
  "resultado": "ERROR",
  "version": "4.0",
  "ficheroEntrada": "/ruta/entrada.pdf",
  "operacion": "firma+sello",
  "error": { "codigo": -1, "mensaje": "keystore password was incorrect" }
}

Por lo general, si no existe el objeto 'error' (y el exit code es 0), la operación terminó correctamente.

VERIFICACIÓN DE FIRMAS

Con -check true solo es necesario el fichero de entrada; el programa devuelve el número de firmas y un array 'firmas' con los datos de cada firma o sello:

java -jar lofirmo_com.jar -fe "firmado.pdf" -check true

{
  "resultado": "OK",
  "version": "4.0",
  "operacion": "verificacion",
  "numeroFirmas": 2,
  "firmas": [
    {
      "nombre": "Signature1",
      "visible": true,
      "posicion": { "pagina": 9, "izquierda": 50.0, "abajo": 700.0, "derecha": 550.0, "arriba": 800.0 },
      "integridadCorrecta": true,
      "cubreTodoElDocumento": false,
      "revision": { "numero": 1, "total": 2 },
      "algoritmoResumen": "SHA256",
      "algoritmoCifrado": "RSA",
      "subFiltro": "/ETSI.CAdES.detached",
      "firmante": "NOMBRE DEL FIRMANTE",
      "fechaFirma": "01-09-2026 17:00:06.00",
      "conSelloTiempo": true,
      "fechaSelloTiempo": "01-09-2026 17:00:06.00",
      "servicioSellado": "C=ES,O=FÁBRICA NACIONAL DE MONEDA Y TIMBRE-REAL CASA DE LA MONEDA,...",
      "selloTiempoValido": true,
      "tipo": "Firma",
      "permiteRellenarCampos": true,
      "permiteAnotaciones": true,
      "bloqueos": 0
    },
    {
      "nombre": "Signature2",
      "visible": false,
      "integridadCorrecta": true,
      "cubreTodoElDocumento": true,
      "subFiltro": "/ETSI.RFC3161",
      "tipo": "Sello de Tiempo"
    }
  ]
}

El campo 'tipo' de cada elemento distingue Firma, Certificación y Sello de Tiempo.

PADES B-LTA (FIRMA LONGEVA)

Con -lta true el documento generado incluye todo lo necesario para que la firma pueda validarse a largo plazo, sin depender de que las fuentes de validación sigan disponibles:

  1. La firma electrónica en formato PAdES (subfiltro ETSI.CAdES.detached) con un sello de tiempo dentro de la propia firma, realizado por la Autoridad elegida con -sello.

  2. La información de validación incrustada en el documento (diccionario DSS/VRI con los certificados y las evidencias de revocación OCSP/CRL de todas las cadenas, incluida la de la propia Autoridad de Sellado).

  3. Un sello de tiempo de documento (ETSI.RFC3161) que protege todo lo anterior, realizado por la Autoridad elegida con -sellodoc.

Puede combinar las Autoridades como prefiera; por ejemplo, firma sellada con la FNMT y sello de documento de MENSATEK:

java -jar lofirmo_com.jar -fe "entrada.pdf" -fs "salida.pdf" -u "Usuario" -p "Contraseña" -cf "certificado.pfx" -pcf "1234" -lta true -sello fnmt -sellodoc mensatek

Si el fichero de entrada no está firmado y no se indica certificado (-cf), el modo -lta genera un sellado longevo: primer sello de documento + información de validación + segundo sello de documento.

EJEMPLOS

Sello de tiempo de un fichero (sello de MENSATEK, por defecto):

java -jar lofirmo_com.jar -fe "prueba.pdf" -fs "prueba_S.pdf" -u "Usuario" -p "Contraseña"

Certificación (firma con su certificado) y sello de tiempo de la FNMT, con el logo de su empresa en el recuadro:

java -jar lofirmo_com.jar -fe "prueba.pdf" -fs "prueba_S.pdf" -u "Usuario" -p "Contraseña" -sello fnmt -i "logo.png" -cf "certificado.pfx" -pcf "1234"

Verificación y chequeo de las firmas y sellos de un PDF:

java -jar lofirmo_com.jar -fe "prueba.pdf" -check true

COMPATIBILIDAD CON LA VERSIÓN 3.x

Las integraciones existentes siguen funcionando sin cambios: los parámetros de la versión 3.x se mantienen y, con -formato texto, la salida vuelve a ser exactamente la clásica (líneas "variable"="valor" con "Estado"="Finalizado/Correcto" o "Resultado"="ERROR-..." y exit code 0). Las novedades de la versión 4 son la salida JSON (por defecto), la elección de la Autoridad de Sellado (-sello/-sellodoc), el perfil PAdES B-LTA (-lta) y la compatibilidad con cualquier Java desde 1.8 hasta 25.