Download Solución de firma de pdf (Servidor) PDF_SIGN

Document related concepts
no text concepts found
Transcript
Manual de uso pdf_sign.jar
FRAMEWORK JAVA 2
Solución de firma de pdf
(Servidor)
PDF_SIGN
Versión 1.4
MARZO 2010
Área de Integración y Arquitectura de Aplicaciones
Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales
Subdirección General de Desarrollo, Tecnología e Infraestructuras
Página: 1
Manual de uso pdf_sign.jar
FRAMEWORK JAVA 2
1 TABLA DE CONTENIDO
1
TABLA DE CONTENIDO............................................................................ 2
2
INTRODUCCIÓN ........................................................................................ 3
3
FUNCIONAMIENTO ................................................................................... 4
4
3.1
Componentes necesarios ........................................................................... 4
3.2
Estructura general ....................................................................................... 4
EJEMPLO ................................................................................................... 7
4.1
Ejemplo general........................................................................................... 7
4.2
Notas ............................................................................................................ 8
Área de Integración y Arquitectura de Aplicaciones
Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales
Subdirección General de Desarrollo, Tecnología e Infraestructuras
Página: 2
Manual de uso pdf_sign.jar
FRAMEWORK JAVA 2
2 INTRODUCCIÓN
En algunos proyectos nos podemos encontrar la necesidad de firma digital de
ficheros en formato pdf desde el servidor. Un ejemplo de esta firma es cuando
la Comunidad de Madrid firma documentos con un sello de organo (certificado
digital de firma de documentos) que devuelve al ciudadano.
Para cumplir con esta necesaridad dentro del framework 2 se ha creado la
librería pdf_sign es una librería que permite firmar documentos PDF.
Actualmente en ICM existe la plataforma ASF que es la encarga de efectuar
todas las operaciones relacionadas con los certificados digitales. En la versión
actual en producción no incluye la firma de pdf en servidor y esta funcionalidad
la vamos a tener disponible para la versión 4.3 de ASF que actualmente se
encuentra en fase de instalación y pruebas en desarrollo.
Para que las aplicaciones puedan ir incorporando esta funcionalidad de firma
de pdfs se ha optado por codificar dicha firma con la librería IText y
encapsularlo dentro de la librería pdf_sign. De forma que las aplicaciones usen
esta librería y en cuanto esté disponible el api de asf de firma de pdf entonces
modificar la librería y sacar una nueva versión de la misma que pueda ejecutar
la firma a través de la plataforma.
La librería pdf_sign que ahora publicamos contiene los siguientes aspectos:
·
·
Firma digital de pdf (incluyendo tanto la firma visible como la invisible)
Firma digital de pfs con sellado de tiempo.
Estos aspectos actualmente se ejecutan a través de la librería Itext lo cual
obliga a utilizar un keystore donde esta almacenado el certificado digital con el
que se va a firmar digitalmente el documento. La ubicación y demás
información sobre este certificado vendrá definida en el fichero de
configuración.
Para incluir el sello de tiempo es necesario disponer de una TSA
(Timestamping Server) que normalmente es un tercero que certificado la hora
en la que se firma mediante un sello de tiempo. A este tercero se accede a
través de una url que será definida en el fichero de configuración. Además
puede que requiera de una autenticación que también irá en el fichero de
configuración. Para las pruebas se ha utilizado la tsa http://time.certum.pl/
aunque actualmente se están realizando pruebas con otras tsa.
Preveiendo que en el futuro la librería acceda también a ASF para ejecutar la
firma digital de pdf se incluye en el fichero de configuración un parámetro que
nos indicará cual en la implementación a utilizar.
Área de Integración y Arquitectura de Aplicaciones
Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales
Subdirección General de Desarrollo, Tecnología e Infraestructuras
Página: 3
Manual de uso pdf_sign.jar
FRAMEWORK JAVA 2
A continuación se explicar más detallamente
funcionalidades indicadas en nuestra aplicación.
como
incorporar
las
3 FUNCIONAMIENTO
3.1 Instalación
Hay que descargarse la librería pdf_sign_1_4.jar y sus dependencias e
incluirlas en el directorio WEB-INF/lib de la aplicación.
Las dependencias de esta librería se pueden descargar directamente de la
web de soja en el fichero pdf_sign.zip.
Necesitaremos también un certificado X509 en formato PKCS#12 instalado
en un keystore, con el que firmaremos los documentos. En soja esta
disponible un keystore para pruebas.
3.2 Configuración
Las variables de configuración asociadas al proceso de firma se pueden
agrupar en 4 grupos:
1. Selección de implementación
Variable
Obligatoria
pdf.sign.implementacion
No
·
Ejemplo
pdf.sign.impl.PdfSignerItextImpl
pdf.sign.implementacion – permite cambiar la implementación que se
usa para la firma a través del fichero de configuración. Por defecto,
pdf.sign.impl.PdfSignerItextImpl. (Actualmente única implementación
desarrollada)
2. keystore para firma con Itext
Variable
pdf.sign.rutaKeystore
pdf.sign.claveKeystore
pdf.sign.alias
pdf.sign.claveAlias
Obligatoria
Ejemplo
Si
../test/resource/2w.p12
Si
CA655C9BB562C317811001D666CFD99B
Si
Certificado importado
Si
CA655C9BB562C317811001D666CFD99B
Área de Integración y Arquitectura de Aplicaciones
Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales
Subdirección General de Desarrollo, Tecnología e Infraestructuras
Página: 4
Manual de uso pdf_sign.jar
·
·
·
·
FRAMEWORK JAVA 2
pdf.sign.rutaKeystore - Ruta fisica en la que se encuentra el certificado
con el que queremos firmar.
pdf.sign.claveKeystore - Clave del almacen de certificados encriptada
con la semilla de BD.
pdf.sign.alias - Alias con el que vamos a firmar el Pdf.
pdf.sign.claveAlias - Clave del alias que vamos a usar encriptada con
la semilla de BD (usualmente coincidirá con la clave del keystore).
3. TSA Server (Servidor de timestamping)
Variable
Obligatoria
Ejemplo
pdf.sign.tsa
No
true
pdf.sign.tsa.url
No
http://time.certum.pl/
pdf.sign.tsa.login
No
loginTSA
pdf.sign.tsa.password
No
CA655C9BB562C317811001D666CFD99B
pdf.sign.tsa.keystore
No
../test/resource/certificadoTSA.pfx
pdf.sign.tsa.keystoreType
No
pkcs12
pdf.sign.tsa.keystorePassword
No
CA655C9BB562C317811001D666CFD99B
pdf.sign.tsa.keystore.alias
No
Certificado TSA
pdf.sign.tsa.truststore
No
../test/resource/trustTSA.keystore
pdf.sign.tsa.truststoreType
No
jks
pdf.sign.tsa.truststorePassword
No
CA655C9BB562C317811001D666CFD99B
Nota: Para pruebas de momento utilizar pdf.sign.tsa y pdf.sign.tsa.url pero sin login y
password ni opciones de keystore
·
·
·
·
·
·
·
·
·
·
pdf.sign.tsa – booleano. En el caso de utilizarlo incluiría el sello en
todas las operaciones de firma aunque se haya indicado que no.
pdf.sign.tsa.url – indica la url de la entidad de certificación de tiempo
donde se encuentra en Servicio de TSA. Obligatorio en caso de usar
una TSA.
pdf.sign.tsa.login – login con el que identificarse dentro de la TSA para
utilizar sus servicios. Este parámetro no es obligatorio, ya que no en
todos los casos es necesaria la autorización a través de login.
pdf.sign.tsa.password – Clave asociada al login anterior encriptada con
la semilla de BD.
pdf.sign.tsa.keystore – almacen que contiene el certificado para
conectarse a la TSA con certificado y https.
pdf.sign.tsa.keystoreType – tipo de almacen que contiene el certificado
anterior.
pdf.sign.tsa.keystorePassword – clave del almacen encriptada con la
semilla de BD
pdf.sign.tsa.keystore.alias – alias del certificado dentro del almacen, en
caso de sólo contener uno, no es necesario indicarla.
pdf.sign.tsa.truststore – almacen de entidades de confianza, en el que
se debe incluir la clave pública del servidor de la TSA.
pdf.sign.tsa.truststoreType – tipo del almacen anterior.
Área de Integración y Arquitectura de Aplicaciones
Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales
Subdirección General de Desarrollo, Tecnología e Infraestructuras
Página: 5
Manual de uso pdf_sign.jar
·
FRAMEWORK JAVA 2
pdf.sign.tsa.truststorePassword – clave del almacen encriptada con la
semilla de BD
4. Proxy para TSA Server
Variable
Obligatoria
Ejemplo
pdf.sign.proxy
No
true
pdf.sign.proxy.host
No
icmupx01.madrid.org
pdf.sign.proxy.port
No
80
pdf.sign.proxy.login
No
loginProxy
pdf.sign.proxy.password
No
CA655C9BB562C317811001D666CFD99B
·
·
·
·
·
pdf.sign.proxy – booleano que indica si es necesario proxy para
acceder al TSA (Timestamping Server).
pdf.sign.proxy.host – Host donde se encuentra el proxy para salir a
internet. Este valor sólo será obligatorio en caso de ser necesario
proxy. Obligatorio en caso de usar proxy.
pdf.sign.proxy.port – Puerto dentro del host por el que se puede
acceder al proxy. Este valor sólo será obligatorio en caso de ser
necesario proxy.
pdf.sign.proxy.login – Login para acceder al proxy. Sólo obligatorio en
caso de ser necesario.
pdf.sign.proxy.password – password asociada al login del proxy. Sólo
obligatorio en caso de ser necesario. Encriptada con la semilla de BD.
3.3 Estructura general
PdfSigner es la clase principal en el proceso de firma y que se encargará de
firmar el documento según los parámetros indicados en el fichero de
configuración.
Para cambiar la apariencia de la firma, se obtiene la referencia al bean que la
define y la da forma dentro del fichero PDF, y situaremos la firma en la
posición donde queremos que aparezca o incluso la haremos invisible llegado
el caso.
Por último, basta con indicar qué fichero se desea firmar y donde se ubicará
el fichero ya firmado.
Además de este uso se ha incluido en la nueva implementación la inclusión
del sello de tiempo a una firma y para ello es necesario configurar las
variables antes señaladas. Y con esta se puede actuar de la misma manera
que en su uso anterior pero indicando que usa una TSA, o usando uno de los
métodos sobrecargados para indicarse mediante parámetro el usuo o no de
la marca de hora en la firma.
Área de Integración y Arquitectura de Aplicaciones
Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales
Subdirección General de Desarrollo, Tecnología e Infraestructuras
Página: 6
Manual de uso pdf_sign.jar
FRAMEWORK JAVA 2
4 EJEMPLO
4.1 Ejemplo general de firma
import pdf.sign.PdfSigner;
import pdf.sign.bean.PdfSignAppearance;
...
// Configuración de la firma
PdfSigner demo = new PdfSigner(Config.getConfig());
// Bean con las propiedades
PdfSignAppearance psa = pdfSigner.getPdfSignAppearance();
// Colocación de la firma
psa.setX(<columna>);
psa.setY(<fila>);
psa.setHeight(<alto>);
psa.setWidth(<ancho>);
// Firma
pdfSigner.signPDF(
new FileInputStream(<ruta del documento a firmar>),
new FileOutputStream(<ruta destino con el documento firmado>),
false);
Área de Integración y Arquitectura de Aplicaciones
Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales
Subdirección General de Desarrollo, Tecnología e Infraestructuras
Página: 7
Manual de uso pdf_sign.jar
FRAMEWORK JAVA 2
4.2 Ejemplo general con sello de tiempo
import pdf.sign.PdfSigner;
import pdf.sign.bean.PdfSignAppearance;
...
// Configuración de la firma
PdfSigner demo = new PdfSigner(Config.getConfig());
// Bean con las propiedades
PdfSignAppearance psa = pdfSigner.getPdfSignAppearance();
// Colocación de la firma
psa.setX(<columna>);
psa.setY(<fila>);
psa.setHeight(<alto>);
psa.setWidth(<ancho>);
// Firma
pdfSigner.signPDF(
new FileInputStream(<ruta del documento a firmar>),
new FileOutputStream(<ruta destino con el documento firmado>),
true);
4.3 Ejemplo invocando con sello de tiempo y firma invisible
// Configuración de la firma
PdfSigner demo = new PdfSigner(Config.getConfig());
// Bean con las propiedades
PdfSignAppearance psa = demo.getPdfSignAppearance();
// Establecer firma invisible
psa.setVisible(false);
// Firma
demo.signPDF(<ruta del documento a firmar>, <ruta destino con el
documento firmado>,true);
4.4 Notas
En caso de que el PDF este en memoria y no queramos guardarlo físicamente
la llamada sería así:
pdfSigner.signPDF(
Área de Integración y Arquitectura de Aplicaciones
Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales
Subdirección General de Desarrollo, Tecnología e Infraestructuras
Página: 8
Manual de uso pdf_sign.jar
FRAMEWORK JAVA 2
new ByteArrayInputStream(<arrayEntrada>),
new ByteArrayOutputStream(<arraySalida>));
Obs: también con opción para sello de tiempo.
Para poder firmar en varias páginas, debe indicarse la página de destino antes
de efectuar la firma:
psa.setPage(<nº de página>);
Área de Integración y Arquitectura de Aplicaciones
Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales
Subdirección General de Desarrollo, Tecnología e Infraestructuras
Página: 9