Firma PDF

Firma PDF simple

Este tipo de firma no cumple con la definición de firma longeva.

Como ejemplo de utilización de los métodos de esta clase se pueden utilizar los de PAdES-LTV a continuación.

Firma PAdES-LTV

IMPORTANTE: Sólo a partir de la versión 1.1.4 de Arangí se generan y validan las firmas PAdES-LTV de acuerdo a todos los estándares.

Las firmas PAdES se definen en los estándares:

  • ETSI TS 102 778. Se puede descargar una copia del estándar aquí.
  • ETSI TS 119 144-2. Se puede descargar una copia del estándar aquí.

Al igual que ocurre con XAdES se definen varios tipos de firma. Arangí implementa la firma PAdES-LTV, que es la primera que cumple con los requisitos para ser una firma longeva. Concrétamente, Arangí siempre trabajará con firmas PAdES-A, ya que siempre exige que el PDF contenga un sello de tiempos de documento que cubra todas las firmas.

Existen dos métodos para obtener una firma PAdES-LTV, dependiendo de si se desea una firma visible o invisible. En el caso de las firmas visibles hay que proporcionar al método las coordenadas de las esquinas inferior izquierda y superior derecha, así como el número de página donde se desea ubicar la firma. También es posible incluir una imagen asociada a la firma.

KeyStoreManager manager = new KeyStoreManager (new File("c:/temp/uactivo951v_firma.p12"), "1234");
ByteArrayDocument documentPDF = new ByteArrayDocument (Util.loadFile(new File("c:/temp/prueba.pdf")));

//-- Firma invisible
PAdESLTVSignature signatureInv = PAdESLTVSignature.sign (new ACCVDeviceManager[] {manager},documentPDF, "Porque quiero firmarlo");

//-- Firma visible
PAdESLTVSignature signatureVis = PAdESLTVSignature.sign (new ACCVDeviceManager[] {manager},documentPDF, "Porque quiero firmarlo", 
        true, Util.readStream(ClassLoader.getSystemResourceAsStream("signature/chip.gif")), 100, 100, 300, 200, 1);

En la página 1 de la segunda firma, en la ubicación indicada por las coordenadas, se verá la imagen chip.gif como una firma realizada sobre el PDF.

El primer parámetro del método de firma es un array de managers, ya que es posible realizar varias firmas a la vez. Es importante destacar que una vez se han añadido los campos que hacen de un PDF firmado un PAdES-LTV ya no es posible volver a firmar el documento. Si un documento se va firmar por varias personas de forma no simultanea lo que se debe hacer es realizar las firmas en un PDF con firma simple y, tras la última firma completar a PAdES-LTV. Por supuesto, entre el principio y el fin del proceso ninguno de los certificados implicados podrá caducar o ser revocado.

//-- Primera firma
KeyStoreManager manager1 = new KeyStoreManager (new File("c:/temp/keystore1.p12"), "1234");
ByteArrayDocument documentPDF = new ByteArrayDocument (Util.loadFile(new File("c:/temp/prueba.pdf")));
PDFSignature signature = PDFSignature.sign (new ACCVDeviceManager[] {manager1}, documentPDF, "Firma 1");

//-- Segunda firma (días más tarde)
KeyStoreManager manager2 = new KeyStoreManager (new File("c:/temp/keystore2.p12"), "4321");
documentPDF = new ByteArrayDocument (signature.toByteArray());
signature = PDFSignature.sign (new ACCVDeviceManager[] {manager2},documentPDF, "Firma 2");

//-- Completar la firma para que sea PAdES-LTV
PAdESLTVSignature padesLTV = PAdESLTVSignature.completeToPAdESLTV(signature);

La validez de una firma longeva se halla limitada a la vida del certificado del último sello de tiempos de documento que contiene el PDF, aunque erroneamente se suele pensar que una firma longeva puede validarse eternamente. Por ejemplo, el certificado de la TSA de la ACCV caducará el 18 de Noviembre de 2016, lo que implica que a partir de esa fecha las firmas PAdES-LTV realizadas con la TSA de la ACCV dejarán de ser válidas. De esta forma se puede comprobar la fecha de caducidad del certificado del último sello de tiempos de documento:

PAdESLTVSignature signature = new PAdESLTVSignature(new File("c:/temp/prueba.pdf"));
Date tsaCertificateDate = signature.getTimeStampCertificateExpiration();

Con el objeto de alargar la vida de una firma longeva será necesario realizar un resellado de la misma cuando se cambie el certificado de la TSA. Este sería el código para realizar un resellado:

PAdESLTVSignature signature = new PAdESLTVSignature(new File("c:/temp/prueba.pdf"));
signature.addDocumentTimeStamp();

¿Qué ocurre con las firmas realizadas con versiones de Arangí anteriores a la 1.1.4?

La norma ETSI TS 119 144-2 exige añadir más información de validación que la que se establecía en la ETSI TS 102 778-4. Por ello, las firmas realizadas con versiones de Arangí anteriores a la 1.1.4 no serán consideradas válidas por dicha versión o versiones posteriores. Para evitar este incoveniente a aquellos desarrollos que se hayan realizado con versiones antiguas es posible activar un flag estático antes de la validación que permitirá que en las validaciones no se tenga en cuenta la información extra exigida por la nueva norma:

  PAdESLTVSignature.olderVersionsAllowed = true;

Ficheros temporales

Al trabajar con Arangí y firmas PDF y PAdES-LTV se generan una serie de ficheros temporales en [directorio_usuario]/.ACCV/ArangiTemp. Al cerrar la JVM éstos ficheros se borran. Si estas acciones se realizan en un servidor Java, cuya JVM puede permanecer mucho tiempo sin ser apagada, los ficheros temporales se irán acumulando pudiendo llegar a ser un problema.

Se recomienda usar el método close() de las clases PDFSignature y PAdESSignature cuando se haya acabado de trabajar con los objetos de esta clase.

PAdESLTVSignature signature = null;
try {
  signature = PAdESLTVSignature.sign(...);
  signature.isValid();
} finally {
  if (signature != null) { signature.close(); }
}

Arangí y Adobe Acrobat

Las últimas versiones de Adobe Acrobat ya hacen uso de firmas PAdES-LTV, aunque existen algunas diferencias entre las firmas PAdES-LTV obtenidas por Adobe y las normas de la ETSI y Arangí.

Adobe Acrobat espera que explícitamente el usuario añada como identidades de confianza los certificados de las Autoridades de Certificación. En el caso de la Agencia de Tecnología y Certificación Electrónica, la mayoría de sus certificados tienen como emisor una Autoridad de Certificación intermedia (normalmente ACCV-CA2) que a su vez tiene como emisor al certificado raiz de la ACCV. Por ello:

  • Para que una firma PAdES-LTV realizada con Arangí sea considerada como válida por Adobe Acrobat es necesario que la Autoridad de Certificación intermedia (la emisora del certificado de firma) se encuentre dada de alta en su lista de identidades de confianza. Las firmas PAdES-LTV ya contienen la información de validación del certificado de la Autoridad de Certificación intermedia, por lo que para Adobe Acrobat sólo debería ser necesario que el certificado raíz de la ACCV estuviese dado de alta en la lista de identidades de confianza.
  • Las firmas PAdES-LTV realizadas con Adobe Acrobat no contienen la información de validación de los certificados dados de alta en su lista de identidades de confianza. Por ello son vistas como válidas por el mismo Adobe Acrobat que contiene dichas identidades de confianza, aunque incumplen con las normas de la ETSI, que exigen que se añada la información de validación de todos los certificados que forman la cadena de confianza del certificado de firma. Por ello, si estas firmas se validan con Arangí, éste siempre devolverá un error de validación en la cadena de confianza del certificado de firma.
PAdES-LTV y Adobe Acrobat

Otra diferencia en las validaciones realizadas con Arangí y Adobe Acrobat estriba en qué se hace si falta la información de validación de algún certificado implicado en las firmas. En el caso de Arangí se devolverá un resultado de validación incorrecto mientras que Adobe Acrobat siempre intentará obtener la información de validación de la red (CRL o respuesta OCSP).