Sei sulla pagina 1di 53

Instituto Nacional de Tecnologas de la Comunicacin

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE


CASO PRCTICO DE DESARROLLO DE APLICACIN DE FIRMA

Instituto Nacional de Tecnologas de la Comunicacin

Copyright (C) 2008 INTECO. Reservados todos los derechos (reproduccin, distribucin, comunicacin pblica, de transformacin, o cualesquiera otros reconocidos por la normativa vigente). El presente documento cumple con las condiciones de accesibilidad del formato PDF (Portable Document Format). Se trata de un documento estructurado y etiquetado, provisto de alternativas a todo elemento no textual, marcado de idioma y orden de lectura adecuado. Para ampliar informacin sobre la construccin de documentos PDF accesibles puede consultar la gua disponible en la seccin Accesibilidad > Formacin > Manuales y Guas de la pgina http://www.inteco.es.

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 2

Instituto Nacional de Tecnologas de la Comunicacin

NDICE
1. 2. 3. NDICE MOTIVACIN CONSIDERACIONES INICIALES
3.1. Catalogar el tipo de SCVA 3.2. Eleccin del nivel de garanta 3.3. Evidencias

3 5 6 6 7 7 9 9
9 10 11 Requisitos Generales Requisitos operacionales Requisitos de Seguridad

4.

ANLISIS
4.1. Toma de Requisitos
4.1.1. 4.1.2. 4.1.3.

4.2. Casos de Uso


4.2.1. 4.2.2. 4.2.3.

14
15 16 16

Caso de Uso Firmar una Factura Electrnica Caso de Uso Validar una Factura Electrnica Caso de Uso Verificar Aplicacin

5.

DISEO
5.1. Diagramas de Flujo
5.1.1. 5.1.2. 5.1.3.

18 18
19 20 21 Diagrama de Flujo Firmar Factura Electrnica Diagrama de Flujo Verificar Factura Diagrama de Flujo Verificar Aplicacin

5.2. Diagrama de Clases 5.3. Definicin de Funciones

21 23 26 26 27
27

6.

DESARROLLO
6.1. Herramientas 6.2. Configuracin del entorno de Desarrollo
6.2.1.

Configuracin de las libreras del MITyC

6.3. Codificacin
6.3.1. 6.3.2.

30
32 35

Operacin Verificar Aplicacin Operacin Firma de facturas

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 3

Instituto Nacional de Tecnologas de la Comunicacin

6.3.3.

Operacin Verificar Factura

44

7.

ABREVIATURAS

53

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 4

Instituto Nacional de Tecnologas de la Comunicacin

Motivacin
Para ejemplificar el desarrollo de aplicaciones basadas en el DNIe se ha desarrollado un caso prctico basado en la creacin de una aplicacin JAVA cliente que permita, desde el men contextual del explorador de ficheros de Windows, realizar las operaciones de firma y validacin de facturas electrnicas usando como dispositivo seguro de creacin de firma el DNI electrnico. Actualmente en el mercado existen aplicaciones, algunas gratuitas, que ya permiten la firma y verificacin de facturas electrnicas. El objetivo de la presente aplicacin no es tanto mostrar el desarrollo dichas funcionalidades sino cmo hacerlo de manera que el resultado pueda ser objeto de una certificacin Common Criteria segn los perfiles de proteccin desarrollados por INTECO.

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 5

Instituto Nacional de Tecnologas de la Comunicacin

Consideraciones iniciales
Para que una Aplicacin de creacin y verificacin de firma electrnica (SCVA) sea certificable se deben cumplir una serie de garantas. Para demostrar que se cumplen dichas garantas se tienen que presentar una serie de evidencias en el proceso de evaluacin, tal y como se explica en el correspondiente Tema de Common Criteria. Las evidencias que se deben presentar quedan definidas en los Perfiles de Proteccin para aplicaciones de creacin y verificacin de firma electrnica. Aunque se puede planificar la certificacin de una aplicacin a posteriori de desarrollarla, el proceso es ms sencillo si se planifica con anterioridad. Por tanto, es muy recomendable leerse los contenidos de los Perfiles de Proteccin antes del inicio del desarrollo.

Catalogar el tipo de SCVA


Existen cuatro Perfiles de Proteccin de aplicaciones de creacin y verificacin de firma electrnica, que son:

PP-Tipo1-EAL1 PP-Tipo1-EAL3 PP-Tipo2-EAL1 PP-Tipo2-EAL3

Lo primero que se observa es que los perfiles de proteccin definen dos tipos de aplicaciones: Tipo 1 y Tipo 2. Estos tipos hacen referencia al entorno operacional en el que van a ejecutarse las aplicaciones. Las aplicaciones de tipo 1 son aplicaciones que van a ejecutarse sobre plataformas en las que la aplicacin tenga un control exclusivo de los interfaces con el firmante, por ejemplo: TDT, PDAs y dispositivos mviles. Las aplicaciones de tipo 2 son aplicaciones que van a ejecutarse en plataformas con sistemas operativos de propsito general, como ordenadores personales. El primer punto que hay que tener en cuenta es en cul de los dos tipos se debe situar la aplicacin que se quiere certificar.

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 6

Instituto Nacional de Tecnologas de la Comunicacin

En el caso del ejemplo que nos ocupa la aplicacin de firma y verificacin de facturas electrnicas va a funcionar sobre ordenadores personales con sistemas operativos de propsito general por tanto es una aplicacin del Tipo 2.

Eleccin del nivel de garanta


Los Perfiles de proteccin de SCVAs basados en el DNI electrnico permiten 2 niveles distintos de garanta. Los niveles de garanta son un indicador de la profundidad que se ha llevado a cabo en el proceso de evaluacin. Los niveles de garanta estn definidos en la Parte 3 de la norma Common Criteria, existiendo 7 niveles, siendo el nivel 1 el ms bsico y el nivel 7 el ms avanzado. Para ver ms detalles sobre los niveles de garanta ver el tema correspondiente. Los perfiles de proteccin permiten certificar las SCVAs en alguno de los siguientes niveles:

EAL1 probado funcionalmente EAL3 - chequeado y probado con metodologa

La eleccin del nivel de garanta es una decisin estratgica. Cuanto mayor es el nivel de garanta se ofrece mayor grado de confianza ante posibles usuarios pero tambin conlleva un mayor coste el proceso de certificacin. Muchas veces la decisin viene marcada por la exigencia de algunos clientes, especialmente administraciones pblicas, que demandan determinados niveles de garanta en las soluciones que van a adquirir. Para este caso prctico se va a realizar una SCVA para ser certificada segn el nivel de garanta EAL1. No obstante las recomendaciones presentadas en el tutorial tambin son de utilidad para el caso de una certificacin EAL3, si bien, en tal caso habr que tener en cuenta requisitos adicionales.

Evidencias
Es importante tener claro desde el primer momento qu evidencias se deben generar para afrontar la certificacin. En el caso que estamos tratando de una certificacin EAL1 las evidencias que se deben presentar son las siguientes:

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 7

Instituto Nacional de Tecnologas de la Comunicacin

Especificacin funcional: esta especificacin debe hacer una correspondencia de los SFRs (Requisitos de seguridad) definidos en el Perfil de Proteccin con las funcionalidades de la aplicacin.

Gua operativa: es la gua de usuario de la aplicacin. Gua preparativa: es la gua de instalacin de la aplicacin. TOE: el objeto de evaluacin, es decir la propia aplicacin. Lista de configuracin: la lista con todas las evidencias entregadas y su control de versin.

Como se puede observar el conjunto de evidencias que hay que generar son la aplicacin en s y una serie de documentacin que acredite la seguridad de la aplicacin y que permita que esta pueda ser elaborada. Adems de estas evidencias hay que elaborar la Declaracin de Seguridad que es un documento que identifica las propiedades de seguridad que van a ser evaluadas.

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 8

Instituto Nacional de Tecnologas de la Comunicacin

Anlisis
Toma de Requisitos
Como en cualquier desarrollo de software lo primero que hay que hacer es una toma de requisitos. Hay que tener en cuenta no slo los requisitos generales sino los requisitos especficos en cuanto a trminos de seguridad.

Requisitos Generales
Como ya se ha comentado la aplicacin del caso prctico es muy sencilla en cuanto a funcionalidad si bien se pueden establecer los siguientes requisitos generales: Requisito Descripcin RG-001 RG-002 Se deben poder firmar facturas electrnicas El formato de las facturas para ser firmadas ser Facturae 3.1 La poltica de firma de las facturas ser la poltica de firma de Facturae 3.1 del MITyC El formato de firma ser XADES-EPES Se deben poder verificar facturas electrnicas El formato de las facturas firmadas ser Facturae 3.1 El tipo de firma que se aceptar para la validacin ser XADES-EPES Para la validacin se seguirn las normas de la poltica de Firma 3.1 del MITyC La aplicacin se ejecutar desde el men contextual del explorador de archivos del windows XP y windows 7 No se soportaran firmas o validaciones en lote

RG-003

RG-004 RG-005 RG-006 RG-007 RG-008

RG-009

RG-010

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 9

Instituto Nacional de Tecnologas de la Comunicacin

RG-011

Las facturas firmadas tendrn el mismo nombre que las facturas originales ms la extensin .xsig La aplicacin ser desarrollada en JAVA 1.6 La aplicacin ser desarrollada con las APIs ofrecidas por el MyTic. Funcionar slo con el DNIe

RG-012 RG-013 RG-014

Para este caso prctico la lista de requisitos generales est muy acotada aunque para una aplicacin ms compleja se debern contemplar muchos ms requisitos generales.

Requisitos operacionales
Uno de los aspectos que hay que tener en cuenta de cara a una certificacin es tener muy acotado el entorno operacional en el que va a ejecutarse la aplicacin. Tal como se explic en el apartado de consideraciones iniciales la aplicacin de este caso prctico es de Tipo 2. En los requisitos operacionales se debe definir qu debe cumplir el entorno operacional para ser considerado como un entorno seguro sobre el que la aplicacin se pueda ejecutar. A la hora de definir estos requisitos ms all de los requisitos que sean necesarios para la aplicacin tambin hay que tener en cuenta las restricciones de seguridad que hay que cumplir. Estas restricciones vienen definidas en el Perfil de Proteccin y son las siguientes:

O.SSCD, dispositivo seguro de creacin de firma

El dispositivo seguro de creacin de firma que usa la Aplicacin de firma y verificacin de facturas electrnicas en formato Facturae ser el DNIe.

O.ITENV, protecciones y mecanismos de seguridad

La plataforma de propsito general que la Aplicacin de firma y verificacin de facturas electrnicas en formato Facturae necesita para operar y para facilitar los interfaces de firmante y con el DNIe, facilita las protecciones y mecanismos de seguridad adecuados para proteger los activos de la SCVA (A.DSCVA, A.VAD y A.SCVA), mediante una combinacin eficaz de medidas de ndole tcnico, de procedimientos y de securizacin de su entorno. Para este caso prctico se definen los siguientes requisitos operacionales:

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 10

Instituto Nacional de Tecnologas de la Comunicacin

Requisito Descripcin RO-001 Se requiere Windows 7 o Windows XP No se soporta ningn otro sistema operativo excepto los definidos en RO001 Se requiere Java 1.5.X o Java 1.6.X No se soporta ninguna versin de Java excepto las definidas en RO-002 Se requiere tener instalado el middleware del DNI electrnico Para la validacin de certificados se requiere conexin a Internet

RO-002

RO-003 RO-004 RO-005 RO-006

Estos requisitos operacionales se debern especificar claramente en la Gua Preparativa como parte del proceso previo a la instalacin de la aplicacin.

Requisitos de Seguridad
A la hora de disear la aplicacin no hay que tener en cuenta nicamente qu funcionalidades se quieren cubrir de cara al usuario final, sino tambin, qu funcionalidades de seguridad tiene que cumplir para que la aplicacin sea certificable. Los requisitos de seguridad estn definidos en el Perfil de Proteccin segn lo que establece la norma Common Criteria. La comprensin de estos requisitos puede resultar un poco complicada al principio pues hay que estar acostumbrado a la terminologa de Common Criteria. En este punto el trabajo consiste en analizar todos los requisitos que hay que cumplir y ver como la SCVA va a realizarlo. En ocasiones varios de los requisitos de seguridad expresados en el perfil de proteccin pueden ser mapeados a un nico requisito de la SCVA. Para este caso prctico se tienen en cuenta los requisitos de seguridad que se muestran en la siguiente tabla. Adems se muestra la relacin de estos requisitos con los requisitos de Common Criteria que mapean.

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 11

Instituto Nacional de Tecnologas de la Comunicacin

Requisito Descripcin

Requisito PP FDP_SDI.2.1 FDP_SDI.2.2

RS-001

Antes de realizar la firma se verificar que el FDP_ISD.1.1 formato de la misma se corresponde con lo FDP_ISD.1.2 definido en RG-002 FDP_ITC.1.1 FDP_ITC.1.2

RS-002

Se mostrar el documento a Firmar Se mostrar la poltica de Firma definida en RG006 El usuario deber dar su conformidad antes de realizar la firma de una factura

FDP_SVR.1.1

RS-003

FDP_ITC.1.3

RS-004

FDP_SVR.1.2

FDP_SVR.1.2 RS-005 Se mostrar por pantalla un aviso sobre la LOPD FDP_SVR.1.3 FTP_ITC.1.1 RS-006 Se comprobar la conexin de la aplicacin con el DNI electrnico en cada operacin FTP_ITC.1.1 FTP_ITC.1.1 FTP_ITC.1.VAD RS-007 Se enviarn los datos a firmar al DNIe por un canal seguro FTP_ITC.1.1 FTP_ITC.1.1

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 12

Instituto Nacional de Tecnologas de la Comunicacin

FTP_ITC.1.1 FDP_RIP.1.1 FCS_COP.1_SIG_CREATION FCS_COP.1.1 FCS_COP.1_SIG_CREATION FCS_COP.1.1 FDP_ISD.1.1 En el proceso de validacin de una factura se comprobar que el esquema es correcto FDP_ISD.1.2 FDP_ITC.1.1 FDP_ITC.1.2 En el proceso de validacin de una factura se comprobar que la contabilidad es correcta FCS_COP.1_SIG_VERIFICATION FCS_COP.1.1 FCS_COP.1_SIG_VERIFICATION RS-011 Al validar una factura se validar la firma FCS_COP.1.1 FCS_COP.1_SIG_VERIFICATION RS-012 Al validar una factura se validar el certificado FCS_COP.1.1 Se mostrar el resultado de las validaciones por pantalla Se podr validar que la aplicacin funciona correctamente

RS-008

Los datos resultantes de una firma se guardaran en un fichero

RS-009

RS-010

RS-013

FDP_SVR.1.1

FPT_TST.1.1 FPT_TST.1.2

RS-014

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 13

Instituto Nacional de Tecnologas de la Comunicacin

FPT_TST.1.3 FPT_TST.1.1 RS-015 Se podr validar que el entorno operacional es el correcto FPT_TST.1.2 FPT_TST.1.3 FPT_TST.1.1 RS-016 El usuario podr ver un informe de si la aplicacin funciona correctamente FPT_TST.1.2 FPT_TST.1.3 Es necesario tener en cuenta estos requisitos en la fase de desarrollo, debiendo quedar especificados en el documento de Especificacin Funcional Bsica para ser entregados como una evidencia en el proceso de certificacin.

Casos de Uso
Una vez estn definidos los requisitos de la aplicacin el siguiente paso recomendable es especificar los casos de uso. Los casos de uso no son como tal una evidencia que haya que entregar en el proceso de certificacin pero resultan de utilidad a la hora de abordar un desarrollo seguro. Ya que la aplicacin es muy sencilla a priori se pueden identificar dos casos de uso a partir de los requisitos generales:

Firmar una factura electrnica Verificar una factura electrnica

Sin embargo si analizamos los requisitos de seguridad RS-014 a RS-016 observaremos que tambin hay que considerar otro caso de uso:

Verificar que la aplicacin funciona correctamente

Como se puede comprobar tener bien catalogados los requerimientos ayuda a identificar los casos de uso de la SCVA.

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 14

Instituto Nacional de Tecnologas de la Comunicacin

Para definir los casos de uso se pueden utilizar diferentes plantillas. Como en este ejemplo prctico se utilizan casos de uso sencillos se definirn en una simple tabla, aunque se podra utilizar alguna herramienta especfica.

Caso de Uso Firmar una Factura Electrnica


Actores Trigger Usuario de la aplicacin El usuario activa la opcin de firmar factura desde el men contextual Se verifica que el fichero corresponda a una factura y se realiza su firma usando el DNI electrnico La aplicacin est correctamente instalada y el entorno operativo es el adecuado

Descripcin

Precondiciones

Postcondiciones Se obtiene la factura firmada Se muestran los datos a Firmar Se muestra la poltica de Firma Se muestra el Aviso del mensaje de la LOPD El usuario selecciona el certificado de Firma Flujo Normal Se accede al dispositivo de firma El usuario introduce el PIN del dispositivo de Firma Se muestra un aviso de seguridad Se crea un fichero con la factura firmada Se muestra un informe del resultado de la operacin El usuario cancela la operacin en algn punto Excepciones El usuario no acepta los avisos de seguridad

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 15

Instituto Nacional de Tecnologas de la Comunicacin

El dispositivo de firma no est conectado El usuario introduce un PIN Errneo

Caso de Uso Validar una Factura Electrnica


Actores Trigger Usuario de la aplicacin El usuario activa la opcin de validar factura desde el men contextual Se verifica que el fichero corresponda a una factura y se realiza su validacin La aplicacin est correctamente instalada y el entorno operativo es el adecuado

Descripcin

Precondiciones

Postcondiciones Se obtienen los datos de verificacin de la firma Se muestra la factura a validar Se muestra la poltica de validacin Se valida el esquema de la factura Flujo Normal Se realiza la validacin contable Se valida la firma Se valida el certificado Se muestra un informe del resultado de la operacin Excepciones El usuario cancela la operacin en algn punto

Caso de Uso Verificar Aplicacin


Actores Usuario de la aplicacin

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 16

Instituto Nacional de Tecnologas de la Comunicacin

Trigger Descripcin

El usuario activa la opcin de Verificar la aplicacin Se verifica que la aplicacin funciona correctamente La aplicacin est correctamente instalada y el entorno operativo es el adecuado

Precondiciones

Postcondiciones Se comprueba la versin del sistema operativo Se comprueba la versin de Java instalada Flujo Normal Se comprueba la existencia de las libreras necesarias Se comprueba si los patch estn bien configurados Se muestra un informe del resultado de la operacin Excepciones

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 17

Instituto Nacional de Tecnologas de la Comunicacin

Diseo
Una vez realizada la fase de anlisis con la toma de requisitos y la definicin de casos de uso se debe proceder al diseo de la solucin. Lo primero que se debe decidir es la tecnologa que se va a utilizar para desarrollar la solucin. Para tomar esta decisin se debe tener en cuenta criterios de seguridad, experiencia de los desarrolladores, funcionalidades requeridas, etc. En el caso de este ejemplo prctico se ha decidido utilizar JAVA, por los siguientes motivos:

Es un lenguaje orientado objetos lo que ofrece mayor control sobre el cdigo y sus excepciones que los lenguajes procedurales.

Existen utilidades para JAVA que facilitan la creacin y verificacin de firmas electrnicas.

Experiencia del equipo de desarrollo en esta tecnologa.

Diagramas de Flujo
Una herramienta recomendable de cara a disear un desarrollo seguro es realizar los diagramas de flujo a partir de los casos de uso definidos. Los diagramas de flujo permiten ver cul es la secuencia de las operaciones que componen los casos de uso as como las posibles excepciones o variantes que pueden ocurrir. Considerar las excepciones y tratarlas correctamente evita posibles vulnerabilidades en el resultado final. Existen en el mercado distintas herramientas para la confeccin de diagramas de flujo que pueden resultar de utilidad cuando se manejan casos de uso complejos. Aunque los casos de uso son sencillos se puede comprobar que los diagramas de flujo pueden ser enrevesados. Es por ello recomendable definir los casos de uso como operaciones simples, y si un caso de uso es muy complejo intentar dividirlo en varios casos de uso ms sencillos. Es recomendable, aunque no imprescindible, incluir los diagramas de flujo en el documento de Especificacin Funcional Bsica para ilustrar mejor el funcionamiento de la aplicacin que se va a certificar.

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 18

Instituto Nacional de Tecnologas de la Comunicacin

Diagrama de Flujo Firmar Factura Electrnica


Validar esquema factura

SI Error

NO

CANCELAR Mostrar error

Mostrar Documento a firmar CONTINUAR

CANCELAR

Mostrar Poltica de firma de facturae 3.1 CONTINUAR

CANCELAR

Mostrar peticin expresa de firma del documento

CONTINUAR

ACEPTAR

CANCELAR Terminar Proceso Mostrar Ventana de insertar DNIE

NO DNIE?

SI

Mostrar error

Firmar Documento en XAdES-EPES

Guardar fichero

Diagrama Flujo Operacin Firma

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 19

Instituto Nacional de Tecnologas de la Comunicacin

Diagrama de Flujo Verificar Factura


Validar esquema

Validar contabilidad

Validar Firma

SI Error

NO Mostrar Resultado Validar Certificado

Diagrama Flujo Operacin Verificacin Factura

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 20

Instituto Nacional de Tecnologas de la Comunicacin

Diagrama de Flujo Verificar Aplicacin


ERROR Validar Sistema Operativo

OK

ERROR Mostrar Error Validar Mquina Virtual JAVA

OK

ERROR Validar Libreras

OK

Mostrar Test OK

Diagrama Flujo Operacin Verificacin Aplicacin

Diagrama de Clases
Un diagrama de clases es un tipo de diagrama esttico que describe la estructura de un sistema mostrando sus clases, atributos y las relaciones entre ellos. Esta herramienta slo tiene sentido en el caso de utilizar una tecnologa orientada a objetos, como es el caso de Java. Es recomendable el uso diagramas de clases para definir el diseo conceptual de la informacin que se manejar en el sistema, y los componentes que se encargarn del funcionamiento y la relacin entre uno y otro. Existe mucha bibliografa sobre cmo distribuir las clases en base a patrones UML (Unified Modelling Language) que es un lenguaje para la definicin de modelos de desarrollo. En el

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 21

Instituto Nacional de Tecnologas de la Comunicacin

caso de aplicaciones complejas es recomendable considerar el uso de alguno de estos patrones predefinidos. Para el caso de esta aplicacin de ejemplo se ha realizado una estructura de clases sencilla como se puede ver en el siguiente diagrama:

Firmar

Verificar

Testear

Firma_Verifica

MostrarFicheroFirma

MostrarFinalizacionProceso

MostrarPeticionFirma

MostrarPoliticaFirma

Diagrama de clases

Tal como se puede observar se crea una clase para cada uno de los casos de uso identificados:

Clase Firmar: Caso de Uso Firmar una Factura Electrnica Clase Verificar: Caso de Uso Verificar una Factura Electrnica Clase Testear: Caso de Uso Verificar Aplicacin

Para minimizar los puntos por donde la aplicacin puede ser atacada se ha definido una clase que funciona como dispatcher para todas las operaciones de firma y verificacin:

Clase Firma_Verifica

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 22

Instituto Nacional de Tecnologas de la Comunicacin

Esta clase contiene la lgica de la aplicacin y aglutina la llamada de las clases Firmar y Verificar. Por ltimo se ha definido una serie de clases necesarias para la interfaz que se va a presentar al usuario:

Clase MostrarFicheroFirma Clase MostrarFinalizacinProceso Clase MostrarPeticinFirma Clase MostrarPolticaFirma

Tal como se puede apreciar en el diagrama todas las llamadas de firma y verificacin pasan a travs de la clase dispatcher Firma_Verifica lo que supone una mayor seguridad ya que la lgica est centralizada en un nico punto.

Definicin de Funciones
Como parte del diseo de las clases se deber especificar qu funciones contiene cada clase. Es muy recomendable realizar este proceso antes de la codificacin ya que se consigue que esta sea mucho ms estructurada y que simplemente consista en implementar la lgica de cada funcin. Idealmente se podra encomendar el diseo y la codificacin a perfiles diferentes, siendo un analista la persona encargada de la definicin de las clases y las funciones que estas contienen y un desarrollador el que codifica estas funciones. En la siguiente tabla se muestran las funciones que componen las clases del ejemplo y se describe qu funcin realiza cada una: Clase Mtodo Descripcin Este mtodo se invoca desde el men Firmar main contextual y redirige la llamada a la clase FirmaVerifica Verificar main Este mtodo se invoca desde el men

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 23

Instituto Nacional de Tecnologas de la Comunicacin

contextual y redirige la llamada a la clase FirmaVerifica Realiza el proceso de comprobacin de que la aplicacin funciona correctamente Muestra un informe con el resultado de la validacin Ejecuta el proceso de firma llamando a firma todas las operaciones que son necesarias para completar el proceso Ejecuta el proceso de verificacin de una verificacion factura llamando a todas las operaciones que son necesarias para completar el proceso Muestra el fichero que se va a firmar mostrarFichero FirmaVerifica Muestra el fichero que se va a validar mostrarFicheroValidar Retorna si ha aceptado o rechazado la operacin Muestra una ventana pidiendo la peticin expresa de firmado del documento mostrarPeticionFirma Retorna si ha aceptado o rechazado la operacin Muestra el fichero de poltica de Facturae 3.1 Retorna si ha aceptado o rechazado la operacin

validar Test mostrarResultado

mostrarPolitica

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 24

Instituto Nacional de Tecnologas de la Comunicacin

Retorna si ha aceptado o rechazado la operacin Muestra el resultado de la operacin realizada Clase con el dilogo grfico que se MostrarFicheroFirma n/a muestra al usuario para visualizar el fichero que se va a Firmar Clase con el dilogo grfico que se MostrarFinalizacionProceso n/a muestra al usuario para visualizar el resultado del Proceso Clase con el dilogo grfico que se MostrarPeticionFirma n/a muestra al usuario para pedir la peticin expresa Clase con el dilogo grfico que se MostrarPoliticaFirma n/a muestra al usuario para visualizar la poltica de Firma

mostrarResultado

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 25

Instituto Nacional de Tecnologas de la Comunicacin

Desarrollo
Herramientas
Antes de empezar la codificacin hay que decidir que herramientas se van a utilizar en el desarrollo. Lo primero que hay que decidir es qu IDE (Integrated Development Environment) se va a utilizar. La utilizacin de un IDE no es un requisito aunque s que es recomendable, ya que permite tener un mayor control sobre el cdigo e incorpora utilidades como la depuracin del cdigo que son muy necesarias. Para este ejemplo se ha usado NetBeans que es un IDE gratuito, si bien existen otras alternativas gratuitas como Eclipse, tambin de gran difusin entre la comunidad de desarrolladores Java. Adems, para realizar las operaciones de firma, la aplicacin se ha basado en la utilizacin de unas APIs proporcionadas por el MITyC (Ministerio de Industria Turismo y Comercio) que permiten la firma, verificacin, y gestin de facturas en formato Facturae. La utilizacin de estas APIs simplifica de una forma significativa el desarrollo, ejemplificando de esta forma la sencillez en la programacin de aplicaciones que hacen uso del DNIe empleando componentes de programacin con un alto nivel de abstraccin. Se pueden descargar las APIs empleadas en este caso prctico y el formato del documento factura. Aunque no se ha considerado para este ejemplo, debido a la sencillez del mismo, es muy recomendable el uso de un repositorio de cdigo para controlar la evolucin del desarrollo. Esta herramienta permite llevar un control de las versiones que se van generando y es especialmente necesario si va a haber varios desarrolladores implicados en el proyecto. En el mercado existen varias alternativas de herramientas para repositorio de cdigo fuente (SVN, CVS, GIT, ), algunas de ellas gratuitas.

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 26

Instituto Nacional de Tecnologas de la Comunicacin

Configuracin del entorno de Desarrollo


Las herramientas de desarrollo que se han seleccionado se deben configurar adecuadamente antes de empezar a escribir la primera lnea de cdigo. Aunque no es un requisito de cara a la certificacin es recomendable tener una gua de la Gestin de la Configuracin. La gua de la Gestin de la Configuracin debe permitir a un hipottico nuevo desarrollador que se incorpore al proyecto configurar su sistema de forma sencilla. En la gua se debe recoger el nombre interno del proyecto, directorios del proyecto, variables de entorno, acceso al repositorio, etc. En el caso de la aplicacin que nos ocupa la configuracin de la misma prcticamente se limita a la configuracin de las libreras del MITyC mencionadas anteriormente. Esta informacin se debera recoger en la gua de Gestin de la Configuracin.

Configuracin de las libreras del MITyC


El MITyC provee distintas libreras a travs de su pgina web:

API para IExplorer: sirve para acceder al almacn de certificados de Windows desde una aplicacin Java.

API para Mozilla bajo Windows: sirve para el acceder a las clases del almacn de certificados del un navegador Mozilla que se ejecute bajo Windows.

API para Mozilla bajo Linux: sirve para el acceder a las clases del almacn de certificados del un navegador Mozilla que se ejecute bajo Linux.

Tal como se especifica en los requisitos generales la aplicacin va a ejecutarse en sistemas operativos Windows por lo que el API utilizado para esta aplicacin ha sido el API para IExplorer. Las libreras adems de contener las clases necesarias vienen acompaadas por un tutorial que muestra:

Proceso de instalacin de el API Componentes que conforman el API Descripcin de las funcionalidades de la API

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 27

Instituto Nacional de Tecnologas de la Comunicacin

Ejemplos de uso del API Guas de configuracin de la API Extensiones de la API

En la API existen tres libreras que hay que utilizar y que deben indicarse en el classpath en el orden que se indica a continuacin:

Facturae-API.jar Facturae-API_CompPack.jar FacturaEBridge.jar

Si no se hace uso de ningn IDE la configuracin del classPath se deber hacer por lnea de comandos, o bien a travs de un fichero .bat, cuando se proceda a compilar la aplicacin. El siguiente ejemplo muestra la sentencia que se debera ejecutar para la compilacin de la aplicacin desde lnea de comando:
javac -classpath lib/activation.jar;lib/commons-logging1.1.jar;lib/Facturae-API.jar;lib/FacturaeAPI_CompPack.jar;lib/FacturaEBridge.jar;lib/jaxb-api.jar;lib/jaxbimpl.jar;lib/jsr173_1.0_api.jar;lib/LibXADESJNI_IE_W.jar;lib/log4j1.2.15.jar;lib/swing-layout-1.0.3.jar;. ClaseCompilar.java

Asimismo para la ejecucin de la aplicacin tambin deberan incluirse las libreras mencionadas en el claspath tal como se muestra en el siguiente ejemplo:
java -classpath lib/activation.jar;lib/commons-logging1.1.jar;lib/Facturae-API.jar;lib/FacturaeAPI_CompPack.jar;lib/FacturaEBridge.jar;lib/jaxb-api.jar;lib/jaxbimpl.jar;lib/jsr173_1.0_api.jar;lib/LibXADESJNI_IE_W.jar;lib/log4j1.2.15.jar;lib/swing-layout-1.0.3.jar;. ClaseEjecutar

Tal como se sealaba al inicio de la seccin para el desarrollo de la aplicacin se va a utilizar NetBeans como IDE. Una de las ventajas de usar un IDE es que la configuracin del entorno de desarrollo se puede realizar a travs de una interfaz grfica. Para configurar las libreras del MITyC se har desde la ventana de propiedades del proyecto tal como se muestra en la siguiente imagen:

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 28

Instituto Nacional de Tecnologas de la Comunicacin

NetBeans classpath

En el caso de que el IDE que se utilizara no fuera NetBeans el proceso resulta muy parecido. En la siguiente imagen se muestra como realizar la configuracin de las libreras desde Eclipse:

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 29

Instituto Nacional de Tecnologas de la Comunicacin

Eclipse classpath

Codificacin
La realizacin del proceso de diseo facilita mucho el trabajo a la hora de realizar la codificacin. Una vez estn definidas las clases y las operaciones que estas deben realizar el proceso de codificacin se limita a aadir la lgica en las funciones. De cara a que la codificacin sea lo ms clara posible, y por tanto hayan menos posibles errores se recomienda lo siguiente:

Realizar una correcta gestin de las excepciones Capturar las excepciones en lugar de lanzarlas sin ms Transformar las excepciones genricas a excepciones propias de la aplicacin

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 30

Instituto Nacional de Tecnologas de la Comunicacin

Usar constantes Evitar incluir datos insertados directamente en el cdigo Agrupar las constantes en una sola clase en lugar de tenerlas desperdigadas por todas las clases

Las funciones deben ser fciles de entender En lugar de hacer funciones muy grandes que realicen muchas operaciones es mejor tener varias funciones que hagan operaciones atmicas Comentar el cdigo

Seguir una convencin en la nomenclatura Usar nombres de clases, mtodos y variables que sean explicativos de para qu sirve cada elemento Se puede usar cualquier convenio mientras se siga sistemticamente. La siguiente tabla muestra una de las convenciones ms habituales:

Regla Regla general para nombres con varias Palabras Nombres de paquetes

Convencin

Ejemplo

Usar la convencin CamelCase

VariableDeTresPalabras

Usar solo minsculas Se sigue la regla general

package lprg.p7;

Nombres de Clases Usar sustantivos Se sigue la regla general Nombre de Variables Primera letra en minscula En maysculas Constantes Separadas por un guin bajo

ColaLlamadas

int numeroDeFirmas;

static Mundo;

final

int

MENSAJE_ALERTA=Hola

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 31

Instituto Nacional de Tecnologas de la Comunicacin

Se sigue la regla general Nombres de mtodos La primera letra en minscula

void

firmaFactura(String

factura);

Todo el cdigo de la aplicacin de ejemplo puede encontrarse en los materiales del caso prctico. Aunque el cdigo es bastante sencillo a continuacin se describe parte del mismo siguiendo el orden de ejecucin de las operaciones que se describe en los casos de uso. Parte de esta informacin, la referente a la ejecucin de las operaciones de los diagramas de flujo, se debe incluir en la Gua Operativa para que sirva de gua de los usuarios de las aplicaciones.

Operacin Verificar Aplicacin


Esta operacin se lanza desde el men contextual de Windows a travs del mtodo main de la clase Test que invoca al mtodo validar de la misma clase. Validar la versin del Sistema Operativo Se comprueba que el sistema operativo se corresponde con alguno de los definidos en el requisito RO-001 con el cdigo que se muestra a continuacin:
if (!((System.getProperty("os.name") != null) && ((System.getProperty("os.name").equals("Windows XP")) || (System.getProperty("os.name").equals("")) || (System.getProperty("os.name").equals("Windows 7")))) { mostrarResultado(<ERROR_MESSAGE>); }

Validar la versin de la mquina virtual de Java Se comprueba que la mquina virtual de Java se corresponde con alguna versin de las definidas en el requisito RO-003 con el cdigo que se muestra a continuacin:
if (!((System.getProperty("java.runtime.version") != null) && ((System.getProperty("java.runtime.version").startsWith("1.6")) || (System.getProperty("java.runtime.version").startsWith("1.5"))))) { mostrarResultado(<ERROR_MESSAGE>);

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 32

Instituto Nacional de Tecnologas de la Comunicacin

Validar las dependencias Se comprueba que las libreras de JAVA que utiliza la aplicacin son las correctas. Para ello se realiza un hash (resumen) de las libreras y se verifica que coincide con el hash que se tiene almacenado. Esto se realiza mediante el cdigo que se muestra a continuacin:
MessageDigest md = MessageDigest.getInstance("MD5"); FileInputStream libreria = null; byte[] fichero = null; byte[] hash = null; int i = 0; String sHash = ""; boolean correcto = true; BASE64Encoder base64 = new BASE64Encoder(); //Recorrer todas las libreras while (correcto && (i < librerias.length)) { //leer la librera libreria = new FileInputStream(librerias[i]); fichero = new byte[libreria.available()]; libreria.read(fichero); libreria.close(); //calcular el Hash md.update(fichero); hash = md.digest(); sHash = base64.encode(hash); //Comparar el hash con el que se tiene guardado if (!sHash.equals(hashesLibrerias[i])) { correcto = false; } i++; }

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 33

Instituto Nacional de Tecnologas de la Comunicacin

Informe de la validacin Se mostrar un informe sobre el funcionamiento de la aplicacin. Se indicar si el sistema operativo en el que se est ejecutando la aplicacin es el correcto, al igual que la mquina virtual de java con la que se ejecuta. Por ltimo se indica si las libreras que est utilizando tambin son las correctas. Esto se hace simplemente invocando el mtodo mostrarResultado de la clase Firma_Verifica mediante el cdigo que se puede ver a continuacin:
mostrarResultado(<RESULT_DETAILS>);

Donde <RESULT_DETAILS> recoge el resultado de las comprobaciones realizadas segn se indica en los apartados anteriores. El mtodo muestra el resultado por pantalla mediante el siguiente cdigo:
private void mostrarResultado(String textoMostrar) { //Generamos la pantalla a mostrar MostrarFinalizacionProceso mostrar = new MostrarFinalizacionProceso(); mostrar.setTitle("Firma de documentos"); mostrar.setSize(500, 350); mostrar.setLocationRelativeTo(null); mostrar.setTexto(textoMostrar); mostrar.setVisible(true); }

Si la validacin ha sido correcta el resultado es que se muestra la siguiente ventana al usuario:

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 34

Instituto Nacional de Tecnologas de la Comunicacin

Pantalla Informe Funcionamiento Aplicacin

Operacin Firma de facturas


Esta operacin se lanza desde el men contextual de Windows a travs del mtodo main de la clase Firmar que invoca al mtodo firma de la clase Firma_Verifica que realiza las operaciones que se describen a continuacin. Validar el esquema de la Factura Lo primero que realiza la aplicacin es comprobar que la factura cumple con el esquema definido por Facturae 3.1. Para realizar esta operacin se hace uso de las libreras del MITyC tal como se puede ver en el cdigo adjunto:
java.io.File factura31 = new java.io.File(facture_a_firmar); ValidatorUtil vu = ValidatorUtil.getInstance(); try { vu.validate(factura31, "3.1"); } catch (Exception e) { mostrarResultado(<ERROR_MESSAGE>); }

En caso de que la operacin falle se recoger la excepcin y se mostrar el error en el informe mediante la funcin mostrarResultado.

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 35

Instituto Nacional de Tecnologas de la Comunicacin

Mostrar la Factura por pantalla Se mostrarn por pantalla los datos de la factura a firmar. Se mostrarn todos los datos de forma que el Usuario de la Aplicacin pueda ver exactamente toda la informacin que va a resultar firmada en la operacin. El usuario deber expresar su consentimiento. Se lee la factura que se va a mostrar por pantalla y se muestra por pantalla tal como se muestra en el siguiente cdigo:
byte[] fichFirma = null; // Leer fichero try { FileInputStream f = new FileInputStream(factura31); fichFirma = new byte[f.available()]; f.read(fichFirma); f.close(); } catch (Exception e){ mostrarResultado(<ERROR_MESSAGE>);} // Mostrar Fichero mostrarFichero(new String(fichFirma))

La funcin mostrarFichero finaliza en mostrar un dialogo con los datos que el usuario va a firmar, haciendo uso de la clase MostrarFicheroFirma tal como se puede ver en el cdigo adjunto:
//Generamos la pantalla a mostrar MostrarFicheroFirma mostrar = new MostrarFicheroFirma(null, true); mostrar.setTitle("Firma de facturas"); mostrar.setSize(800, 600); mostrar.setLocationRelativeTo(null); mostrar.setTexto(textoMostrar); mostrar.setTitulo("Factura a firmar:"); mostrar.setVisible(true); return mostrar.getReturnStatus() == mostrar.RET_OK;

Este cdigo hace que aparezca la pantalla que se muestra en la siguiente imagen:

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 36

Instituto Nacional de Tecnologas de la Comunicacin

Documento a firmar

En el caso de que el usuario pulse el botn Cancel se deber abortar el proceso y mostrar el resultado de la operacin. Esto se controla mediante el cdigo de retorno de la funcin mostrarFichero mencionada anteriormente. Mostrar Poltica de Firma Se mostrar al usuario de la Aplicacin la poltica de firma conforme a la que se va a realizar la operacin. El usuario deber expresar su consentimiento pulsando en Ok. Esto se hace mediante el mtodo mostrarPolitica de la clase Firma_Verifica mediante el cdigo que se puede ver a continuacin:
private boolean mostrarPolitica() { byte[] politica = null; //Se lee la poltica a mostrar

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 37

Instituto Nacional de Tecnologas de la Comunicacin

try { // La poltica est en el directorio de recursos FileInputStream fichPolitica = new FileInputStream(<FICH_POLITICA>); politica = new byte[fichPolitica.available()]; fichPolitica.read(politica); fichPolitica.close(); } catch (Exception e) { mostrarResultado(<ERROR_MESSAGE>); } //Se genera la pantalla a mostrar MostrarPoliticaFirma mostrar = new MostrarPoliticaFirma(null, true); mostrar.setTitle("Firma de documentos"); mostrar.setSize(800, 600); mostrar.setLocationRelativeTo(null); mostrar.setTexto(new String(politica)); mostrar.setVisible(true); return mostrar.getReturnStatus() == mostrar.RET_OK; }

Como se puede apreciar en el cdigo la funcin consiste en dos operaciones, una leer la poltica y otra mostrarla por pantalla haciendo uso de la clase MostrarPoliticaFirma. El resultado es que se muestra la siguiente ventana al usuario:

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 38

Instituto Nacional de Tecnologas de la Comunicacin

Poltica de firma

En el caso de que el usuario pulse el botn Cancel se deber abortar el proceso y mostrar el resultado de la operacin. Esto se controla mediante el cdigo de retorno de la funcin mostrarPoliticaFirma mencionada anteriormente. Aviso de LOPD Se alertar al usuario del tratamiento al que sern sometidos sus datos. El usuario deber expresar su consentimiento pulsando en OK. Esto se hace mediante el mtodo mostrarPeticionFirma de la clase Firma_Verifica mediante el cdigo que se puede ver a continuacin:
private boolean mostrarPeticionFirma() { //Generamos la pantalla a mostrar MostrarPeticionFirma mostrar = new MostrarPeticionFirma(null, true);

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 39

Instituto Nacional de Tecnologas de la Comunicacin

mostrar.setTitle("Firma de documentos"); mostrar.setSize(500, 250); mostrar.setLocationRelativeTo(null); mostrar.setVisible(true); return mostrar.getReturnStatus() == mostrar.RET_OK; }

Como se puede apreciar en el cdigo la funcin consiste en mostrar el aviso por pantalla haciendo uso de la clase mostrarPeticionFirma. El resultado es que se muestra la siguiente ventana al usuario:

Peticin de firma

En el caso de que el usuario pulse el botn Cancel se deber abortar el proceso y mostrar el resultado de la operacin. Esto se controla mediante el cdigo de retorno de la funcin mostrarPeticionFirma mencionada anteriormente. Seleccin de Certificado Se mostrarn los certificados disponibles para realizar la operacin. Si el usuario tiene el DNIe conectado se le mostrar la pantalla de peticin de contrasea para acceder a los certificados del DNIe para poderlo mostrar. Este proceso hace uso de las libreras del MITyC dejando que sean estas junto con los drivers del DNI electrnico las que se encarguen de las llamadas a bajo nivel. Desde el punto de vista de la aplicacin nicamente hay que realizar la siguiente llamada:

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 40

Instituto Nacional de Tecnologas de la Comunicacin

File fichSalida = es.mityc.facturae.utils.SignatureUtil.sign(factura31, pathSalida);

Esta llamada finaliza en una serie de operaciones a bajo nivel:

El middleware del DNI electrnico pide al usuario que introduzca el PIN del dispositivo.

Se muestran los certificados del almacn de Windows. El usuario selecciona el certificado que va a utilizar la firma. En este punto el usuario tiene la posibilidad de comprobar la validez del certificado mediante la opcin Validacin OCSP que comprueba que el certificado no est revocado.

El usuario debe seleccionar el certificado del DNI electrnico adecuado para firmar (contiene la palabra FIRMA en el nombre del certificado).

El middleware del DNI electrnico pide al usuario que introduzca de nuevo el PIN del dispositivo.

El middleware del DNI muestra una alerta de seguridad indicando que se va a realizar una firma que el usuario debe aceptar.

Guardar la factura firmada en la ubicacin <pathsalida> que debe ser el nombre original de la factura ms la extensin .xsig tal como se recoge en RG-011.

Para realizar estas operaciones al usuario le aparecen las pantallas que se muestran a continuacin:

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 41

Instituto Nacional de Tecnologas de la Comunicacin

Pantalla de certificados

Pantalla peticin Pin

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 42

Instituto Nacional de Tecnologas de la Comunicacin

Pantalla de acceso a clave privada

En el caso de que se produzca algn error o que el usuario cancele en algn momento se deber abortar el proceso y mostrar el resultado de la operacin. Esto se controla mediante el cdigo de retorno de la funcin sign mencionada anteriormente. Informe del resultado de la operacin Se presenta un informe con el resultado de la operacin indicando si se ha firmado correctamente o se ha producido algn tipo de error. Esto se hace simplemente invocando el mtodo mostrarResultado de la clase Firma_Verifica mediante el cdigo que se puede ver a continuacin:
mostrarResultado(<SUCCESS_MESSAGE>);

El mtodo muestra el resultado por pantalla mediante el siguiente cdigo:


private void mostrarResultado(String textoMostrar) { //Generamos la pantalla a mostrar MostrarFinalizacionProceso mostrar = new MostrarFinalizacionProceso(); mostrar.setTitle("Firma de documentos"); mostrar.setSize(500, 350); mostrar.setLocationRelativeTo(null); mostrar.setTexto(textoMostrar); mostrar.setVisible(true); }

El resultado es que se muestra la siguiente ventana al usuario:

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 43

Instituto Nacional de Tecnologas de la Comunicacin

Pantalla de resultado Firma

Operacin Verificar Factura


Esta operacin se lanza desde el men contextual de Windows a travs del mtodo main de la clase Verificar que invoca al mtodo verificacion de la clase Firma_Verifica que realiza las operaciones que se describen a continuacin. Comprobar que el fichero existe El primer paso consiste en verificar que el fichero que se quiere verificar existe. Esto se hace mediante el siguiente cdigo:
//Comprobar que el fichero existe. java.io.File factura31 = new java.io.File(pathEntrada); boolean error = false; String resultado = ""; if (!factura31.exists()) { mostrarResultado(<ERROR_MESSAGE>); }

En caso de que el fichero no exista se aborta el proceso y se muestra la pantalla de resultado de la operacin indicando el error.

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 44

Instituto Nacional de Tecnologas de la Comunicacin

Cargar el fichero Esta operacin se encarga de cargar el fichero en un objeto Document para documentos XML y comprobar que la estructura del mismo es correcta. Se puede ver el cdigo a continuacin:
//Preparar la factura para validar el formato DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); org.w3c.dom.Document document31 = null; try { javax.xml.parsers.DocumentBuilder parser = dbf.newDocumentBuilder(); document31 = parser.parse(factura31); } catch (Exception e) { mostrarResultado(<ERROR_MESSAGE>); }

En caso de que el fichero no se pueda cargar en un objeto Document se aborta el proceso y se muestra la pantalla de resultado de la operacin indicando el error. Mostrar Factura a Validar Se mostrarn por pantalla los datos de la factura a verificar. Se mostrarn todos los datos de forma que el Usuario de la Aplicacin pueda ver exactamente toda la informacin que va a verificarse. El usuario deber expresar su consentimiento. Se lee la factura que se va a mostrar por pantalla y se muestra por pantalla tal como se muestra en el siguiente cdigo:
byte[] fichFirma = null; // Leer fichero try { FileInputStream f = new FileInputStream(factura31); fichFirma = new byte[f.available()]; f.read(fichFirma); f.close(); } catch (Exception e){

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 45

Instituto Nacional de Tecnologas de la Comunicacin

mostrarResultado(<ERROR_MESSAGE>);} // Mostrar Fichero mostrarFicheroValidar (new String(fichFirma))

La funcin mostrarFicheroValidar finaliza en mostrar un dialogo con los datos que el usuario va a firmar, haciendo uso de la clase MostrarFicheroFirma tal como se puede ver en el cdigo adjunto:
private boolean mostrarFicheroValidar(String textoMostrar) { //Generamos la pantalla a mostrar MostrarFicheroFirma mostrar = new MostrarFicheroFirma(null, true); mostrar.setTitle("Validacin de Factura"); mostrar.setSize(800, 600); mostrar.setLocationRelativeTo(null); mostrar.setTexto(textoMostrar); mostrar.setTitulo("Factura a verificar:"); mostrar.setVisible(true); return mostrar.getReturnStatus() == mostrar.RET_OK; }

Este cdigo hace que aparezca la pantalla que se muestra en la siguiente imagen:

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 46

Instituto Nacional de Tecnologas de la Comunicacin

Documento validado

En el caso de que el usuario pulse Cancel se deber abortar el proceso y mostrar el resultado de la operacin. Esto se controla mediante el cdigo de retorno de la funcin mostrarFicheroValidar mencionada anteriormente. Mostrar Poltica de Verificacin Se mostrar al usuario de la Aplicacin la poltica de verificacin conforme a la que se va a realizar la operacin. El usuario deber expresar su consentimiento pulsando en Ok. Esto se hace mediante el mtodo mostrarPolitica de la clase Firma_Verifica mediante el cdigo que se puede ver a continuacin:
private boolean mostrarPolitica() { byte[] politica = null; //Se lee la poltica a mostrar

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 47

Instituto Nacional de Tecnologas de la Comunicacin

try { // La poltica est en el directorio de recursos FileInputStream fichPolitica = new FileInputStream(<FICH_POLITICA>); politica = new byte[fichPolitica.available()]; fichPolitica.read(politica); fichPolitica.close(); } catch (Exception e) { mostrarResultado(<ERROR_MESSAGE>); } //Se genera la pantalla a mostrar MostrarPoliticaFirma mostrar = new MostrarPoliticaFirma(null, true); mostrar.setTitle("Firma de documentos"); mostrar.setSize(800, 600); mostrar.setLocationRelativeTo(null); mostrar.setTexto(new String(politica)); mostrar.setVisible(true); return mostrar.getReturnStatus() == mostrar.RET_OK; }

Como se puede apreciar en el cdigo la funcin consiste en dos operaciones, una leer la poltica y otra mostrar la por pantalla haciendo uso de la clase MostrarPoliticaFirma. El resultado es que se muestra la siguiente ventana al usuario:

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 48

Instituto Nacional de Tecnologas de la Comunicacin

Poltica de firma

En el caso de que el usuario pulse Cancel se deber abortar el proceso y mostrar el resultado de la operacin. Esto se controla mediante el cdigo de retorno de la funcin mostrarPoliticaFirma mencionada anteriormente. Validacin del esquema de la factura Se debe comprobar que el esquema de la factura se corresponde con lo especificado en Facturae 3.1. Esto se realiza mediante el siguiente cdigo de la funcin verificacin de la clase Firma_Verifica:
ValidatorUtil vu = ValidatorUtil.getInstance(); try { vu.validate(factura31, "3.1"); } catch (Exception e) { mostrarResultado(<ERROR_MESSAGE>);

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 49

Instituto Nacional de Tecnologas de la Comunicacin

Como se puede ver en el cdigo se usa la clase ValidatorUtil de las libreras del MITyC que est dentro del paquete es.mityc.facturae.utils.ValidatorUtil. En caso de que la validacin no sea correcta se mostrar el error en la pantalla con el informe del resultado. Validacin contable de la factura Se debe comprobar que la contabilidad de la factura es correcta. Esto se realiza mediante el siguiente cdigo de la funcin verificacin de la clase Firma_Verifica:
ValidadorEfactura31 validator31 = new ValidadorEfactura31(); try { validator31.valid(document31); catch (Exception e) { mostrarResultado(<ERROR_MESSAGE>); }

Como se puede ver en el cdigo se usa la clase ValidadorEfactura31 de las libreras del MITyC que est dentro del paquete es.mityc.facturae.utils. ValidadorEfactura31. En caso de que la validacin no sea correcta se mostrar el error en la pantalla con el informe del resultado. Verificar la firma de la factura Se debe comprobar que la contabilidad de la factura es correcta. Esto se realiza mediante el siguiente cdigo de la funcin verificacin de la clase Firma_Verifica:
Map m = es.mityc.facturae.utils.SignatureUtil.validateSignature(document31);

Como se puede ver en el cdigo se usa la clase validateSignature de las libreras del MITyC que est dentro del paquete es.mityc.facturae.utils.validateSignature. Si el resultado m es distinto de null significa que la firma es correcta. Validacin del certificado Se debe comprobar que el certificado con el que se ha firmado la factura es vlido. Esto se realiza mediante el cdigo de la funcin verificacin de la clase Firma_Verifica.

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 50

Instituto Nacional de Tecnologas de la Comunicacin

Esta operacin se divide en varios pasos. El primero es extraer el certificado de la factura y comprobar que es criptogrficamente correcto, es decir, que no est corrupto. Esto se hace con el cdigo que se muestra a continuacin:
//Recuperamos el certificado y lo validamos X509Certificate cert = (X509Certificate) m.get("sign.certificate");

El siguiente paso es comprobar que el certificado no est caducado:


//Validamos la caducidad del certificado //Comprobamos que ha sido emitido antes de la fecha actual if (new Date().after(cert.getNotBefore())) { //Comprobamos que la fecha de caducidad es posterior a la actual if (cert.getNotAfter().after(new Date())); } else { mostrarResultado(<ERROR_MESSAGE>); }

La ltima comprobacin que se debe efectuar es que el certificado no est revocado. Para ello se utilizar el servicio de OCSP ofrecido por el DNI electrnico:
//Comprobamos que no est revocado OCSPCliente ocsp = new OCSPCliente("http://ocsp.dnie.es"); try { RespuestaOCSP res = ocsp.validateCert(cert); if (res.getNroRespuesta()!= 0){ mostrarResultado(<ERROR_MESSAGE>); }

Informe de la validacin Se mostrar un informe con el resultado de la operacin realizada. El informe contendr informacin acerca de:

Validacin de esquema Validacin contable Validacin de firma Validacin de certificado

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 51

Instituto Nacional de Tecnologas de la Comunicacin

Esto se hace simplemente invocando el mtodo mostrarResultado de la clase Firma_Verifica mediante el cdigo que se puede ver a continuacin:
mostrarResultado(<RESULT_DETAILS>);

El mtodo muestra el resultado por pantalla mediante el siguiente cdigo:


private void mostrarResultado(String textoMostrar) { //Generamos la pantalla a mostrar MostrarFinalizacionProceso mostrar = new MostrarFinalizacionProceso(); mostrar.setTitle("Firma de documentos"); mostrar.setSize(500, 350); mostrar.setLocationRelativeTo(null); mostrar.setTexto(textoMostrar); mostrar.setVisible(true); }

Si la validacin ha sido correcta el resultado es que se muestra la siguiente ventana al usuario:

Pantalla de resultado Verificacin

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 52

Instituto Nacional de Tecnologas de la Comunicacin

Abreviaturas

Aplicacin de creacin y verificacin de firma electrnica (SCVA) los medios utilizados para la creacin y verificacin de firma electrnica, sin incluir el SSCD.

Certificado es una garanta electrnica que une los datos de verificacin de firma (SVD) a una persona y confirma la identidad de esa persona.

Datos a ser firmados (DTBS) son los datos electrnicos completos que hay que firmar (incluyendo tanto los atributos del mensaje del usuario como los de la firma).

Datos de verificacin de autenticacin (VAD) son datos de entrada de autenticacin proporcionados por el usuario para la autenticacin de su identidad bien sea demostrando el conocimiento o bien derivados de las caractersticas biomtricas del usuario.

Datos de verificacin de firma (SVD) son los datos, como cdigos o claves criptogrficas pblicas, que se utilizan para de verificar una firma electrnica.

Dispositivo seguro de creacin de firma (SSCD) es el software o hardware configurado para aplicar los datos de creacin de firma (SCD).

Firmante es la persona que est en posesin de un dispositivo de creacin de firma y que acta en su propio nombre o en el de la entidad o persona fsica o jurdica a la que representa.

DESARROLLO Y CERTIFICACIN DE APLICACIONES SOBRE DNIE Caso Prctico de desarrollo de aplicacin de firma 53

Potrebbero piacerti anche