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