70
UNIVERSIDAD POLITÉCNICA DE MADRID Escuela Técnica Superior de Ingenieros Informáticos ENTREGA PARCIAL DE TRABAJO FIN DE MÁSTER EN INGENIERÍA INFORMÁTICA Sistema de gestión de firmas digitales de documentos desde plataformas fijas y móviles Autor: Manuel Valbuena Hervás Tutor: Luis Mengual Galán Julio 2018

UNIVERSIDAD POLITÉCNICA DE MADRID Escuela Técnica …oa.upm.es/51621/1/TFM_MANUEL_VALBUENA_HERVAS.pdf · x Sinadura :proyecto de código libre para firma masiva de documentos x

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

UNIVERSIDAD POLITÉCNICA DE MADRID

Escuela Técnica Superior de Ingenieros Informáticos

ENTREGA PARCIAL DE TRABAJO FIN DE MÁSTER EN INGENIERÍA INFORMÁTICA

Sistema de gestión de firmas digitales de

documentos desde plataformas fijas y móviles

Autor: Manuel Valbuena Hervás

Tutor:

Luis Mengual Galán

Julio 2018

Resumen

ii

Resumen El presente trabajo de fin de máster trata de describir y justificar el sistema cliente-servidor

de gestión de firmas digitales multiplataforma que se ha codificado.

Abstract

iii

Abstract

The present Master's Thesis aims to describe and justify the cross-platform digital client-server management system that has been encoded.

Índice de contenidos Resumen ........................................................................................................................... ii Abstract ........................................................................................................................... iii Índice de contenidos ....................................................................................................... iv Introducción y objetivos .................................................................................................. 1

1. Introducción ............................................................................................................. 1 1.1. ¿Qué es la firma digital de documentos y para qué sirve? ................................ 1 1.2. Certificado digital para la firma de documentos ................................................. 1 1.3. Firma electrónica avanzada y firma electrónica reconocida ............................... 2 1.4. Utilidad práctica de la firma digital de documentos ............................................ 2 1.5. ¿Qué es el sistema de gestión de firmas digitales de documentos

multiplataforma? ................................................................................................................ 2 1.6. Motivación de la creación del sistema de gestión de firmas............................... 3

2. Objetivos.................................................................................................................. 3 2.1. Creación de la base de datos ............................................................................ 3 2.2. Creación del servidor......................................................................................... 3 2.3. Creación de la infraestructura de red segura ..................................................... 3 2.4. Creación de los clientes .................................................................................... 3 2.5. Utilización del DNI 3.0 ....................................................................................... 3

Estado de la cuestión ....................................................................................................... 5 1. Aplicaciones existentes de firma electrónica de documentos ................................... 5 2. Aplicaciones multiplataforma existentes de firma electrónica de documentos .......... 5 3. Ámbito de negocio del presente trabajo ................................................................... 6

Planteamiento del problema ............................................................................................ 7 1. Base de datos .......................................................................................................... 7

Planteamientos desechados ........................................................................................ 7 2. Servidor ................................................................................................................... 7

Planteamientos descartados ........................................................................................ 8 Planteamientos modificados ........................................................................................ 8 Planteamientos añadidos ............................................................................................. 8

3. Comunicación segura .............................................................................................. 8 Planteamientos descartados ........................................................................................ 8 Planteamientos modificados ........................................................................................ 9

4. Clientes ................................................................................................................... 9 5. DNI 3.0 .................................................................................................................... 9

Planteamientos revisados .......................................................................................... 10 Solución planteada ........................................................................................................ 11

1. Base de datos ........................................................................................................ 11 2. Servidor principal (Java) ........................................................................................ 12 3. Cliente Java ........................................................................................................... 14 4. Cliente Android ...................................................................................................... 15 5. Comunicación ........................................................................................................ 16

Conclusiones y líneas futuras ....................................................................................... 19 Conclusiones ............................................................................................................. 19 Líneas futuras ............................................................................................................ 19

Bibliografía ..................................................................................................................... 20 Anexo 1: Detalles del protocolo de comunicación XML .............................................. 22 Anexo 2: Capturas de la aplicación .............................................................................. 43

1. Capturas del servidor en Netbeans ........................................................................ 43 2. Capturas del cliente java administrador ................................................................. 45 3. Capturas del cliente java usuario ........................................................................... 50 4. Capturas del cliente usuario Android ..................................................................... 56

Índice de contenidos

v

Introducción y objetivos

1

Capítulo 1 Introducción y objetivos

1. Introducción 1.1. ¿Qué es la firma digital de documentos y para qué sirve? La firma digital de un documento es un conjunto de datos digitales asociados al mismo

obtenidos a partir de aplicarle un algoritmo criptográfico asimétrico en el cual se ha usado una clave privada correspondiente a una entidad.

Mediante el descifrado de los datos firmados utilizando el mismo algoritmo criptográfico

asimétrico y la clave pública correspondiente a la entidad que firmó (verificación de la firma digital), se están garantizando los siguientes servicios de seguridad:

La autenticación del usuario firmante, de forma que se le pueda identificar de

manera inequívoca. La integridad del documento firmado, de forma que se pueda asegurar que el

documento es el mismo que el original y no ha sufrido alteración. El no repudio ante la firma realizada, ya que la entidad es el propietario de la clave

privada guardada con contraseña, por lo tanto no puede negar haber sido el autor de dicha firma, salvo prueba de lo contrario.

Se diferencia de la firma electrónica simple de documentos en que esta es la conversión del trazo de una firma en una imagen ya sea mediante software o hardware, la cual, a pesar de ser legal, no ofrece ninguna garantía sobre la identidad del firmante.

1.2. Certificado digital para la firma de documentos El certificado digital es un fichero informático con una estructura de datos que contiene

información sobre una entidad y, a su vez, está firmado por otra entidad, que garantiza la autenticidad de los datos en el mismo. Contiene también la clave pública de la entidad. Si se trata de un certificado de clave privada, contiene además de la clave pública, la clave privada de la entidad. Los certificados de clave pública pueden ser enviados al público destinatario, mientras que los de clave privada no, ya que la clave privada no puede salir del sistema.

A la hora de firmar documentos es necesario disponer de un certificado de clave privada

(para obtener la clave privada de la propia entidad para firmar), o bien de otros mecanismos como el dni electrónico (firma electrónica reconocida), que proporciona los certificados de clave privada correspondientes.

A la hora de verificar la firma de un documento es necesario disponer de un certificado de

clave pública (para obtener la clave pública de la entidad firmante).

Introducción y objetivos

2

1.3. Firma electrónica avanzada y firma electrónica reconocida Ambos tipos de firmas pertenecen al conjunto de firma digital y son superiores a la firma

electrónica simple. La firma electrónica avanzada es aquella firma electrónica que permite establecer la

identidad del firmante respecto de los datos firmados y comprobar la integridad de los mismos, estando vinculada al firmante mediante certificados y por haber sido creada por medios de alto nivel de confianza, bajo su exclusivo control. Un ejemplo de uso de este tipo de firma es el uso de criptografía asimétrica, generando claves y certificados correspondientes para realizar y verificar la firma.

La firma electrónica reconocida es aquella firma electrónica avanzada que además se

basa en un certificado reconocido y está generada mediante un dispositivo seguro de creación de firma. A efectos de ley, es considerada equivalente a la firma manuscrita. Un ejemplo de este tipo de firma es el uso del dni-electrónico, que contiene todos los certificados reconocidos y claves privadas en su interior para realizar y verificar la firma.

1.4. Utilidad práctica de la firma digital de documentos Además de las características de seguridad previamente mencionadas, nos permiten

realizar operaciones por internet que en la vida cotidiana requerirían de una firma para validarlas.

Algunos ejemplos de estas operaciones:

Realización de la declaración de la renta a través de internet (firma electrónica avanzada)

Petición de vida laboral (firma electrónica avanzada) Firma de correos electrónicos (firma electrónica avanzada) Firma de facturas electrónicas (firma electrónica avanzada) Renovación de un certificado digital (firma electrónica reconocida) Firma de un testamento (firma electrónica reconocida) Firma de la escritura de una vivienda (firma electrónica reconocida)

1.5. ¿Qué es el sistema de gestión de firmas digitales de documentos

multiplataforma? Es un sistema cliente-servidor que se encargará de llevar a cabo las firmas digitales de

cualquier documento en un entorno distribuido, donde los mismos puedan estar físicamente ubicados en cualquier plataforma fija o móvil. Como también del almacenamiento de la firma o necesidad de firma de los mismos y de la información y certificados públicos de las entidades que firman.

Con el concepto multiplataforma se quiere dar a entender un sistema que sea capaz de funcionar en la mayoría de dispositivos fijos o móviles utilizando lenguajes de programación que permitan dan este soporte.

Introducción y objetivos

3

1.6. Motivación de la creación del sistema de gestión de firmas La motivación del presente trabajo se basa en la escasez de mecanismos actuales o

carencias de software para poder realizar todos los procesos pertenecientes a la realización de una firma electrónica avanzada o reconocida en un entorno distribuido. Además del reto de la implementación de código nativo para cada una de las plataformas que contengan las claves privadas.

2. Objetivos 2.1. Creación de la base de datos Se creará una base de datos de documentos, con toda la estructura necesaria para poder

gestionar los documentos, usuarios y firmas. 2.2. Creación del servidor Se creará un servidor que sirva de intermediario entre la base de datos y los clientes

multiplataforma, ofreciendo los servicios correspondientes a la gestión de firmas y documentos.

2.3. Creación de la infraestructura de red segura Se utilizará el protocolo de seguridad de sockets seguros en el intercambio de información

entre cliente y servidor y entre servidor y base de datos, es decir, aplicado a todo el tráfico de la aplicación, para permitir la conexión segura entre todos los elementos del sistema.

. 2.4. Creación de los clientes Se crearán diferentes clientes en plataformas fijas y móviles que permitan la comunicación

con el servidor y realizar la firma electrónica o verificación de la misma en sus entornos correspondientes.

2.5. Utilización del DNI 3.0 Se utilizará el acceso al dni electrónico en los clientes móviles a través de NFC, utilizando

todos los mecanismos de interfaz y de comunicación con sus datos internos para proceder tanto a la lectura de los datos de la entidad como a realizar la firma electrónica reconocida.

Introducción y objetivos

4

Estado de la cuestión

5

Capítulo 2 Estado de la cuestión

1. Aplicaciones existentes de firma electrónica de documentos Actualmente existe un amplio abanico de posibilidades a la hora de firmar documentos.

Desde aplicaciones cotidianas hasta aplicaciones más avanzadas llevadas a cabo para ese propósito.

Algunas aplicaciones cotidianas y de propósito general que permiten realizar e incluir la

firma electrónica en un documento:

Acrobat Reader Microsoft Office Libre Office

Algunas aplicaciones enfocadas a realizar la firma digital de documentos con

características más avanzadas:

Xolido Sign : Aplicación veloz de firma y verificación con con múltiples opciones personalizadas y avanzadas.

Clicksign : Aplicación de pago que permite firmas múltiples, firma avanzada y firma reconocida con DNI u otros dispositivos, así como su verificación.

Sinadura :proyecto de código libre para firma masiva de documentos Ecofirma : Aplicación del ministerio de industria, utiliza java, permite la firma

avanzada y la reconocida con DNI electrónico, así como su verificación.

2. Aplicaciones multiplataforma existentes de firma electrónica de documentos A pesar de que las aplicaciones mencionadas en el apartado anterior poseen una gran

funcionalidad, la mayoría de ellas tiene problemas con la portabilidad entre diversas plataformas, teniendo que utilizar diferentes versiones de la aplicación para unos sistemas operativos u otros, y en algunos casos, ni siquiera existiendo la versión de las mismas para un determinado sistema.

Sin embargo, sí hay algunas aplicaciones totalmente multiplataforma: Viafirma es la primera empresa española en ofrecer soporte para firma electrónica y

firma reconocida con DNI para múltiples plataformas y dispositivos. Cualquier aplicación integrada con Viafirma Platform, ya sea aplicación web o nativa móvil, dispondrá de un soporte para firmas avanzadas y reconocidas sin necesidad de llevar a cabo una instalación o un desarrollo adicional. Posee un enorme conjunto de características avanzadas como validación de certificados revocados y caducados, diferentes modalidades de firma electrónica, verificación, almacenamiento de múltiples documentos, kits de desarrollo, etc. Además de diversos entornos multiplataforma.

Estado de la cuestión

6

3. Ámbito de negocio del presente trabajo El marco de trabajo más importante donde se encuadra la necesidad de la presente

aplicación es en el ámbito multiplataforma y en el ámbito de la firma reconocida, donde hay muy pocas aplicaciones existentes y además son de pago o difíciles de conseguir para la demanda de usuarios que necesitan esos servicios en la actualidad.

Planteamiento del problema

7

Capítulo 3

Planteamiento del problema A continuación se describirá como se ha planteado la forma de abordar el problema en

cada una de las entidades del sistema.

1. Base de datos Base de datos MySQL. Estará compuesta por las siguientes tablas:

Documentos: los documentos en formato blob que se podrán firmar, también tienen su identificador, nombre del documento y teléfono de asistencia del documento.

Usuarios: los usuarios que podrán firmar los documentos con su id, dni, nombre y teléfono. Estos también tienen almacenado un certificado de clave pública en formato blob

Firmas: las firmas realizadas por los usuarios en formato blob con su id. Firmas a deber: Permiten referenciar qué firmas están pendientes de realizar

entre qué usuarios y qué documentos, a través de los ids de todos ellos. Firmas generadas: Permiten referenciar qué firmas se han generado entre qué

usuarios y qué documentos, a través de los ids de todos ellos. Esta tabla es complementaria de la anterior.

Toda operación de actualización de la base de datos deberá realizarse dentro de una transacción y deberá cancelarse caso de que se genere algún error o excepción, devolviendo el código de error correspondiente si esto sucede.

Toda operación de inserción en la base de datos deberá devolver el número de filas insertadas.

Planteamientos desechados

Se había pensado en la posibilidad de haber utilizado una base de datos de Big Data no

relacional como medida para optimizar el almacenamiento de documentos. Sin embargo finalmente se ha decidido usar SQL pues los ficheros que se almacenan en el sistema no van a ser muy grandes.

2. Servidor Estará codificado en Java, que es un lenguaje con bastante portable a múltiples

plataformas. Ofrecerá principalmente los siguientes servicios:

Inserción de documento Extracción de documento Inserción de usuario

Planteamiento del problema

8

Extracción de usuario Inserción de firma a deber Consulta de firmas a deber por un usuario Inserción de firma Extracción de firma Verificación de firma

El traspaso de datos entre servidor y cliente se hará en forma de objeto serializado, con

sus campos correspondientes, dependiendo de la petición solicitada. La firma se traspasará en forma de un fichero objeto serializado que contendrá 3 campos:

{documento, firma del documento, certificado de clave pública del usuario firmante}. El servidor atenderá las peticiones de los clientes de manera asíncrona.

Planteamientos descartados Se había pensado en la posibilidad de utilizar un servidor web, sin embargo se desechó

esta posibilidad para poder codificar un protocolo propio y más ligero.

Planteamientos modificados La firma estará en un fichero XML con sus 3 campos correspondientes y no como objeto

de java, como medida más estándar para homogeneizar el carácter multiplataforma.

Planteamientos añadidos Se añadieron, adicionalmente, los siguientes objetivos:

El servidor tendrá la capacidad para, a partir de un certificado sin firmar proveniente del cliente, devolverle un certificado firmado por su autoridad de certificación.

El servidor tendrá la funcionalidad para poder autenticar al cliente con un mecanismo de desafío-respuesta.

3. Comunicación segura

Se utilizará el protocolo de sockets seguros TLS. Se utilizará el proveedor de servicios bouncy castle. No será necesaria la autenticación de cliente. Se utilizarán almacenes de clave tipo BKS-V1 para compatibilidad con clientes

Android Los certificados que se usarán en esta comunicación segura se crearán con la

librería open SSL y los almacenes de claves con la herramienta keytool. La comunicación segura deberá estar presente tanto en la comunicación servidor-

clientes como en la comunicación servidor-base de datos

Planteamientos descartados

Se había pensado en la posibilidad de utilizar autenticación de cliente en el protocolo de sockets seguros, sin embargo se ha visto innecesaria esta acción, además de que no

Planteamiento del problema

9

permitiría la conexión a un usuario desconocido antes de registrarse en el sistema. La autenticación se puede llevar a cabo a nivel de aplicación.

Planteamientos modificados

Se había dictaminado que se utilizaran objetos como medida de intercambio de mensajes

en el protocolo, sin embargo más adelante se cambió a que se debiera utilizar un protocolo que no sea propio de lenguajes java sino más estándar como XML o JSON. Finalmente se decidió por XML.

4. Clientes

Se distinguen dos entidades administrativas principales con las siguientes características: Administrador:

Introduce documentos Actualiza las firmas a deber Verifica las firmas Normalmente estará en una plataforma fija y en java

Usuario:

Se registra con un certificado creado por el sistema o bien aportando su propio certificado o su DNI-e

Descarga documentos Consulta las firmas a deber Firma documentos de acuerdo a las firmas a deber y actualiza las firmas

generadas La clave privada y el certificado de clave pública de un usuario deberán guardarse

en almacenes de tipo PKCS12 .La clave privada jamás debe salir del sistema y lo que se envía al servidor es el certificado de clave pública.

Puede estar en cualquier plataforma, fija o móvil, ya sea java, Android o C.

5. DNI 3.0

Se utilizará en entornos de cliente móvil utilizando la tecnología NFC para su lectura y

acceso a certificados. Los dos modos de uso que se van a utilizar en el DNI 3.0 son los siguientes:

Modo lectura: se obtendrán los datos personales correspondientes a un usuario, los cuales podrán utilizarse para una autenticación del mismo. El usuario deberá introducir el CAN de su DNI electrónico.

Modo firma: se obtendrá el certificado de firma y su clave privada, con la cual un usuario podrá realizar la firma reconocida de un documento y registrar el certificado de clave pública en el servidor, con lo cual el administrador, posteriormente, podrá validar su firma utilizando la clave pública contenida en dicho certificado. El usuario deberá introducir el CAN y el PIN de su DNI electrónico.

Planteamiento del problema

10

Planteamientos revisados La clave privada del DNI no se puede sacar fuera del dispositivo (si se pudiera sería un

fallo grave de seguridad) y por lo tanto habrá que firmar desde dentro del mismo.

Solución planteada

11

Capítulo 4 Solución planteada

A continuación se describirá como se ha resuelto el problema en cada una de las

entidades del sistema.

1. Base de datos Se ha desplegado un servidor de base de datos MySQL con todas las tablas necesarias

para el correcto funcionamiento de la aplicación y con servicios de seguridad. Las tablas tienen motor de almacenamiento InnoDB para que admitan transacciones,

claves ajenas y bloqueos. A continuación se detalla gráficamente la estructura de las tablas:

Toda operación de actualización de la base de datos se realiza dentro de una transacción

que engloba los cambios en la tabla o tablas correspondientes, y en el caso que haya habido un fallo, la transacción se deshace y no hay cambio en ninguna tabla.

Toda operación de inserción en la base de datos devuelve el número de filas insertadas. Toda operación en la base de datos devuelve un código de error. Si no ha habido ningún

error, dicho código será un 100. El acceso a la base de datos por parte del servidor principal (que es, a su vez, cliente del

servidor MySQL) se ha implementado con SSL (sockets seguros). Esto se ha conseguido, del

Solución planteada

12

lado de la base de datos, modificando el fichero de configuración de MySQL (my.ini) añadiéndole la siguiente configuración se seguridad:

Habiendo creado previamente los certificados y clave privada ahí referenciadas y

poniéndolos en la ruta correspondiente. Del lado del servidor principal se ha implementado un almacén de confianza para guardar

el certificado de AC del servidor de la base de datos. El almacén de confianza y su clave se cargan con directivas de asignar propiedades al sistema de java.

Además se han añadido los parámetros correspondientes para SSL a la cadena de

conexión del lado del servidor principal:

2. Servidor principal (Java) Está codificado en Java, que es un lenguaje con portabilidad a múltiples plataformas.

Se ha desplegado el servidor java con su funcionamiento aparentemente correcto. Se ha dividido en 2 subcapas: Capa de conexión a la base de datos

Es la parte del servidor que se encarga de conectar a la base de datos y obtener o actualizar información en ella de manera segura, transaccional, y con control de excepciones.

Su conexión a la base de datos se ha implementado con sockets seguros (SSL). La clase que ejecuta estos servicios tiene como nombre ControladorBBDD. java y se

puede testear de manera aislada con mediante la clase TesteoBBDD.java. Ofrece los siguientes servicios hacia BBDD:

Conexión Desconexión Comprobar conectividad

Solución planteada

13

Registrar documento (a partir de sus campos) Recuperar documento (a partir de su id) Recuperar documento (a partir de su id y la id de un usuario) Recuperar documentos (a partir de la id de un usuario) Recuperar documentos (todos) Eliminar documento (a partir de su id) Registrar usuario (a partir de sus campos) Recuperar usuario (a partir de su id) Recuperar usuario (a partir de su dni) Recuperar usuario firmante (a partir de la id de una firma) Recuperar usuarios (todos) Eliminar usuario (a partir de su id) Registrar firma a deber (a partir de sus campos) Recuperar firma a deber (a partir de la id del documento y la id del usuario) Recuperar firmas (a deber a partir de la id de un usuario) Recuperar firmas a deber (todas) Eliminar firma a deber (a partir de la id del documento y la id del usuario) Registrar firma (a partir de sus campos) Recuperar firma (a partir de su id) Recuperar firmas (a partir de la id de un usuario) Recuperar firmas (todas) Eliminar firma (a partir de su id)

Capa de conexión al cliente

Es la parte del servidor que se encarga de aceptar conexiones con el cliente de manera asíncrona y segura para ofrecerle la información o realizar las acciones que este último necesite.

Su conexión al cliente se ha implementado con sockets seguros (TLS). La clase que ejecuta estos servicios tiene como nombre Servidor.java y se puede testear

desde el cliente. El servidor también tiene la funcionalidad de crear certificados firmados con su autoridad

de certificación asociada a partir de uno con requerimiento de firma que le envíe el cliente. También tiene la funcionalidad de negociar con el cliente un mecanismo de autenticación

por desafío respuesta para comprobar si este es quien dice ser. Ofrece los siguientes servicios en función del perfil del cliente:

Comprobar conexión (usuario y administrador) Crear certificado (usuario) Desafío-respuesta (usuario y administrador) Registrar documento (administrador) Recuperar documento (usuario) Recuperar documento (administrador) Recuperar documentos (usuario) Recuperar documentos (administrador) Eliminar documento (administrador) Registrar usuario (usuario)

Solución planteada

14

Recuperar usuario (usuario y administrador) Recuperar usuario firmante (administrador) Recuperar usuarios (administrador) Eliminar usuario (administrador) Registrar firma a deber (administrador) Recuperar firma a deber (administrador) Recuperar firmas a deber (usuario) Recuperar firmas a deber (administrador) Eliminar firma a deber (administrador) Registrar firma (usuario) Recuperar firma (administrador) Recuperar firmas (usuario) Recuperar firmas (administrador) Eliminar firma (administrador)

El protocolo de traspaso de datos entre servidor y cliente se hace en forma de fichero

XML, con sus campos correspondientes, dependiendo de la petición solicitada y la respuesta dada. Con esto se consigue portabilidad de comunicaciones entre diferentes lenguajes de programación.

La firma se traspasará y guardará en forma de un fichero XML que contendrá 3 campos:

documento, firma del documento y certificado de clave pública del usuario firmante. El servidor atiende las peticiones de los clientes de manera asíncrona.

3. Cliente Java Su conexión al servidor se ha implementado con sockets seguros (TLS). Su protocolo de comunicación con el servidor se hace mediante XML, usando una librería

que permite transformar un objeto HashMap y todos sus campos en fichero XML y viceversa. El cliente se ha dividido en dos entidades operacionales: Usuario y Administrador, cada

una de las cuales realiza tareas diferentes contra el servidor. Las ejecución de la firma de un documento y verificación de la misma se desarrollan

específicamente en el cliente, usando al servidor sólo para obtener el documento en el caso de la firma o la firma y el certificado de usuario en el caso de la verificación, ya que la verificación también comprueba que el certificado de usuario que está dentro del objeto que engloba a la firma digital, es exactamente el mismo certificado que el usuario tiene registrado en el sistema.

Esto incurre en el problema del código nativo. Cada cliente va a tener que ejecutar la firma

o la verificación a su manera nativa, sin poder centralizarlo en el servidor. Una centralización de estos servicios no sería correcta desde el punto de vista de la seguridad, ya que obligaría a la clave privada a viajar hacia el servidor.

También se ha implementado para un mecanismo de autenticación por desafío-respuesta.

El cliente recibe una palabra aleatoria del servidor que deberá cifrarla con su clave privada y enviársela de vuelta al servidor, para que, usando la clave pública del supuesto mismo usuario almacenada en el certificado en la base de datos, el servidor compruebe que se llega a la misma palabra original que él propuso. También requiere de ejecución nativa en cliente a la hora de firmar un mensaje.

Solución planteada

15

La conexión al servidor se ha implementado con sockets seguros (TLS). La clase que posee todos los servicios necesarios del cliente es Cliente.Java y las clases

que proveen de una interfaz visual para las entidades de Usuario y Administrador, respectivamente, son UsuarioIU.java y AdministradorIU.java, aunque también hay clases que proveen una interfaz por comandos (de las primeras versiones del cliente).

La clase FirmaDigital.java contiene los servicios para las funciones de firma y verificación

de documentos así como para el de autenticación de usuario. La clase TransformadorMapXML.java contiene el servicio de serialización y deserialización

de objetos a formato XML. A continuación se describen las funcionalidades para cada tipo de cliente : Administrador:

Se autentica por un mecanismo desafío respuesta basado en un certificado de administrador cuya clave privada reside en un almacén del cliente y clave pública en un certificado en el servidor

Registra, recupera y elimina documentos Registra, recupera y elimina firmas a deber Recupera, verifica y elimina firmas Recupera y elimina usuarios

Usuario:

Se registra con un certificado creado por el sistema o bien aportando su propio certificado

Se autentica por un mecanismo desafío respuesta basado en un certificado de usuario cuya clave privada reside en un almacén del cliente y clave pública en el certificado de usuario en la base de datos del servidor

Recupera sus documentos Recupera sus firmas a deber Firma sus documentos de acuerdo a sus firmas a deber Recupera sus firmas

4. Cliente Android

El cliente Android tiene se basa únicamente en la entidad usuario.

Su conexión al servidor se ha implementado con sockets seguros (TLS). Su protocolo de comunicación con el servidor se hace mediante XML, usando una librería

que permite transformar un objeto HashMap y todos sus campos en fichero XML y viceversa.

La clase que posee todos los servicios necesarios del cliente es Cliente.java y las clases que proveen de una interfaz de botones para la entidad usuario son la ActividadAcceso.java, que es la que permite conectar con el servidor por primera vez y la ActividadPrincipal.java que es la que ofrece los servicios, una vez se ha comprobado poder conectar.

Solución planteada

16

La clase FirmaDigital.java contiene los servicios para las funciones de firma y de autenticación.

La clase TransformadorMapXML.java contiene el servicio de serialización y deserialización

de objetos a formato XML. La conexión con el servidor se debe llevar a cabo como proceso de fondo y por eso la

clase que se encarga de ello es TareaCliente.java, que es una tarea asíncrona. Una vez terminada su ejecución con los servicios de fondo, envía una notificación a un BroadcastReceiver denominado broadcast.java con los datos de la respuesta para que los trate o muestre el hilo principal.

Se utiliza el DNI 3.0 para la obtención de los certificados del mismo y la firma reconocida. El DNI-e se reconoce a través de NFC, pidiendo al usuario su can para poder leer sus

datos personales y contraseña para poder firmar. La clave privada del DNI-e no sale del propio dispositivo, y el DNI debe permanecer

pegado al teléfono para que se realice la firma. La clase que realiza la lectura y firma con el DNI es ActividadNFCDNI.java, la cual, a su

vez, utiliza un módulo privado llamado dniedroid, que contiene el código (compilado y no visible) para acceder al DNI.

Lista de funcionalidades: Usuario:

Se registra con un certificado creado por el sistema o bien aportando su propio certificado o con el certificado de su DNI-e

Se autentica por un mecanismo desafío respuesta basado en un certificado de usuario cuya clave privada reside en un almacén del cliente o en el DNI-e y clave pública en el certificado de usuario en la base de datos del servidor

Recupera sus documentos Recupera sus firmas a deber Firma sus documentos de acuerdo a sus firmas a deber Recupera sus firmas

5. Comunicación A nivel de transporte se ha implementado con sockets seguros cualquier comunicación

entre cualquiera de las partes del sistema. Los tipos de almacenes utilizados entre clientes y servidor principal han sido de tipo BKS-

V1 para compatibilidad con Android. El tipo de almacén utilizado entre servidor principal y servidor de BBDD ha sido tipo JKS.

Se ha usado OpenSSL y Keytool para la creación de certificados y almacenes.

También se ha utilizado la útil herramienta KeyStore Explorer, que permite visualizar certificados y almacenes y cambiarles el tipo, entre otras cosas.

Solución planteada

17

A nivel de aplicación se ha usado XML como protocolo de comunicación entre clientes y servidor, lo que favorece la compatibilidad con cualquier tipo de sistema o plataforma y la homogeneidad del desarrollo en los clientes, ya que todos los sistemas y plataformas son capaces de escribir y leer código XML.

Para que cualquier tipo de cliente pueda comunicarse con el servidor, el principal requisito

es que deba poder implementar sockets seguros. Una vez hecho esto, tan sólo basta con conocer el protocolo de comunicación, que cualquier cliente podrá implementar, ya que XML es un lenguaje universal.

Solución planteada

18

Conclusiones y líneas futuras

19

Capítulo 5 Conclusiones y líneas futuras

Conclusiones El sistema actual al haber sido desarrollado en java y en Android, y además permitir la

comunicación con cualquier otro sistema, abarca un enorme abanico de posibilidades a la hora de ser desplegado en múltiples plataformas y dispositivos.

Existe el problema de la compatibilidad con java en ciertas plataformas ARM, como por

ejemplo en los dispositivos móviles IOS, donde los fabricantes no permiten la ejecución de java en las mismas, debido a problemas de seguridad. Esto conlleva a tener que realizar versiones nativas para ciertas plataformas, aunque aprovechando la característica de comunicación homogénea que posee el sistema este problema se reduce en la parte del protocolo de comunicaciones a nivel aplicativo, que sí es multiplataforma y homogéneo 100%. No en la parte de realizar la firma electrónica, o incluso en la parte de los sockets seguros.

Líneas futuras

A corto plazo se prevé desarrollar clientes en otros lenguajes de programación como C. A largo plazo sería deseable desplegar un sistema único y totalmente homogéneo a todas

las plataformas en todos los aspectos del sistema, para reducir el esfuerzo de tener que paliar con códigos nativos.

Una primera intención sería delegar todo el trabajo de la firma electrónica en el servidor,

sin embargo esto no es correcto debido a que sería un problema grave de seguridad que la clave privada salga del control del cliente. En el caso del DNI, esto ni siquiera es posible, ya que la clave privada no sale del DNI y, por lo tanto, toda la ejecución de la firma se realiza dentro del mismo, lo que obliga a tener que lidiar con el código nativo del dispositivo cliente en donde se conecte el DNI.

Una opción que sí sería posible es usando una interfaz web. Es decir, si se pudiera

realizar todo el sistema en html y javascript, sería un sistema absolutamente multiplataforma y homogéneo, donde cualquiera que sea el cliente, va a poder visualizar un navegador que le permita realizar su firma.

El problema radica en que todavía no existen APIs de interfaz web que permitan, de forma

sencilla, la firma electrónica reconocida con DNI en el navegador, por lo tanto, habría que intentar desarrollar esa misma API con html y javascript para poder leer el DNI a través de NFC, para lo cual se necesita información del manejo a bajo nivel de los certificados y firmas del DNIe.

Otra línea futura a corto plazo es la realización de un cliente IOS nativo mediante java

usando Multi-OS engine, lo cual permitiría reconvertir el cliente actual de Android a un cliente IOS usando el mismo IDE de Android studio sin mucho esfuerzo ni demasiados cambios.

Bibliografía

20

Bibliografía

Bibliografía

21

Portal de la administración electrónica del gobierno, recuperado el 28 de Abril de 2018: http://firmaelectronica.gob.es/Home/Ciudadanos/Firma-Electronica.html Página de información sobre soluciones de firma digital https://www.pymesyautonomos.com/tecnologia/siete-soluciones-para-firmar-documentos-

de-forma-digital Páginas de información de viafirma y viafirma platform https://www.viafirma.com/es/firma-electronica-con-dnie-en-iphone-y-ipad-con-viafirma https://www.viafirma.com/es/platform-autenticacion-firma-electronica Página personal de Luis Mengual, documentación de apoyo para software de seguridad

en red, recuperado durante los meses de Marzo y Abril de 2018: http://www.personal.fi.upm.es/~lmengual/DSSR/DESARROLLO_SOFTWARE_SEGURIDA

D_RED.html

Anexo 1: Detalles del protocolo de comunicación XML

22

Anexo 1: Detalles del protocolo de comunicación XML

Las peticiones hay que enviarlas en un fichero de bytes con formato XML y las respuestas

vendrán dadas también en un fichero con dicho formato. Cada campo del fichero XML contiene una estructura que representa a una tabla hash o

mapa (mapHash) donde tiene entradas de tipo clave y valor, especificadas ambas en etiquetas XML con su respectivo formato de dato. Si el dato fuera un fichero de bytes, se envía codificado en Base 64. La estructura puede contener, a su vez, subestructuras anidadas, como una lista de elementos mapa, anidados de igual manera en etiquetas XML. Esto es útil cuando el servidor debe devolver muchos valores.

Ejemplo de fichero XML de una petición

Ejemplo de fichero XML de una respuesta

Previo a cada petición o a cada respuesta se envía en formato de número entero la

longitud del fichero que se enviará a continuación.

Anexo 1: Detalles del protocolo de comunicación XML

23

A continuación se detalla el protocolo por cada servicio (tanto de usuario como de administrador)

Comprobar conexión (usuario y administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>comprobar_conexion</string> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> </map> Crear certificado (usuario) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>crear_certificado</string> </entry> <entry> <string>bytes</string> <byte-array> Bytes de fichero de certificado sin firmar en formato Base64 </byte-array> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?><map> <entry> <string>bytes</string>

Anexo 1: Detalles del protocolo de comunicación XML

24

<byte-array> Bytes de fichero de certificado firmado en formato Base64 </byte-array> </entry> </map> Desafío-respuesta (usuario y administrador) Datos de petición 1 para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>desafio_respuesta</string> </entry> </map> Datos de respuesta 1 del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>bytes</string> <byte-array> Bytes de palabra del servidor en formato Base64</byte-array> </entry> </map Datos de petición 2 para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>bytes</string> <byte-array> Bytes de palabra del servidor firmada en formato Base 64</byte-array> </entry> <entry> <string>dni</string> <string>Dni de usuario</string> </entry> </map> Datos de respuesta 2 del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string>

Anexo 1: Detalles del protocolo de comunicación XML

25

<int> Código de respuesta del servidor </int> </entry> <entry> <string>id</string> <int>Id de usuario</int> </entry> </map Registrar documento (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>registrar_documento</string> </entry> <entry> <string>bytes</string> <byte-array>Bytes de fichero de documento en formato Base64 </byte-array> </entry> <entry> <string>propietario</string> <string> Propietario de documento </string> </entry> <entry> <string>telefono</string> <string> Teléfono de documento </string> </entry> <entry> <string>nombre</string> <string> Nombre de documento </string> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int>Código de respuesta del servidor</int> </entry> <entry> <string>id</string> <int> Id de documento </int> </entry> <entry> <string>inserciones</string> <int>Número de inserciones realizadas </int> </entry> </map>

Anexo 1: Detalles del protocolo de comunicación XML

26

Recuperar documento (usuario) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>recuperar_documento</string> </entry> <entry> <string>id_doc</string> <int> Id de documento </int> </entry> <entry> <string>id_usu</string> <int> Id de usuario asociado al documento </int> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> <entry> <string>datos</string> <byte-array> Bytes de fichero de documento en formato Base64 </byte-array> </entry> <entry> <string>propietario</string> <string> Propietario de documento </string> </entry> <entry> <string>telefono</string> <string> Telefono de documento </string> </entry> <entry> <string>nombre</string> <string> Nombre de documento </string> </entry> </map> Recuperar documento (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map>

Anexo 1: Detalles del protocolo de comunicación XML

27

<entry> <string>accion</string> <string>recuperar_documento_a</string> </entry> <entry> <string>id</string> <int> Id de documento </int> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> <entry> <string>datos</string> <byte-array> Bytes de fichero de documento en formato Base64 </byte-array> </entry> <entry> <string>propietario</string> <string> Propietario de documento </string> </entry> <entry> <string>telefono</string> <string> Telefono de documento </string> </entry> <entry> <string>nombre</string> <string> Nombre de documento </string> </entry> </map> Recuperar documentos (usuario) <?xml version="1.0" encoding="UTF-8" standalone="no"?><map> <entry> <string>accion</string> <string>recuperar_documentos</string> </entry> <entry> <string>id_usu</string> <int> Id de usuario asociado a documento </int> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry>

Anexo 1: Detalles del protocolo de comunicación XML

28

<string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> <entry> <string>documentos</string> <list> <map> <entry> <string>estado</string> <string> Estado de documento firmado no no firmado por usuario </string> </entry> <entry> <string>propietario</string> <string> Propietario de documento </string> </entry> <entry> <string>id</string> <int> Id de documento </int> </entry> <entry> <string>telefono</string> <string> Telefono de documento </string> </entry> <entry> <string>nombre</string> <string> Nombre de documento </string> </entry> </map> <map> … </map> ….. </list> </entry> </map> Recuperar documentos (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?><map> <entry> <string>accion</string> <string>recuperar_documentos_a</string> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string>

Anexo 1: Detalles del protocolo de comunicación XML

29

<int> Código de respuesta del servidor </int> </entry> <entry> <string>documentos</string> <list> <map> <entry> <string>propietario</string> <string> Propietario de documento </string> </entry> <entry> <string>id</string> <int> Id de documento </int> </entry> <entry> <string>telefono</string> <string> Telefono de documento </string> </entry> <entry> <string>nombre</string> <string> Nombre de documento </string> </entry> </map> <map> … </map> ….. </list> </entry> </map> Eliminar documento (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>eliminar_documento</string> </entry> <entry> <string>id</string> <int> Id de documento </int> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int>

Anexo 1: Detalles del protocolo de comunicación XML

30

</entry> </map> Registrar usuario (usuario) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>registrar_usuario</string> </entry> <entry> <string>bytes</string> <byte-array>Bytes de fichero de certificado de usuario en formato Base64 </byte-array> </entry> <entry> <string>dni</string> <string> Dni de usuario </string> </entry> <entry> <string>telefono</string> <string> Teléfono de usuario </string> </entry> <entry> <string>nombre</string> <string> Nombre de usuario </string> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int>Código de respuesta del servidor</int> </entry> <entry> <string>id</string> <int> Id de documento </int> </entry> <entry> <string>inserciones</string> <int>Número de inserciones realizadas </int> </entry> </map> Recuperar usuario (usuario y administrador) Datos de petición para el servidor

Anexo 1: Detalles del protocolo de comunicación XML

31

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>recuperar_usuario</string> </entry> <entry> <string>id</string> <int> Id de usuario </int> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> <entry> <string>cert</string> <byte-array> Bytes de fichero de certificado de usuario en formato Base64 </byte-array> </entry> <entry> <string>telefono</string> <string> Telefono de usuario </string> </entry> <entry> <string>nombre</string> <string> Nombre de usuario </string> </entry> <entry> <string>dni</string> <string> Dni de usuario </string> </entry> </map> Recuperar usuario firmante (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>recuperar_usuario_firmante</string> </entry> <entry> <string>id_firma</string> <int> Id de firma asociada a usuario </int>

Anexo 1: Detalles del protocolo de comunicación XML

32

</entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> <entry> <string>cert</string> <byte-array> Bytes de fichero de certificado de usuario en formato Base64 </byte-array> </entry> <entry> <string>telefono</string> <string> Telefono de usuario </string> </entry> <entry> <string>nombre</string> <string> Nombre de usuario </string> </entry> <entry> <string>dni</string> <string> Dni de usuario </string> </entry> </map> Recuperar usuarios (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>recuperar_usuarios</string> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> <entry> <string>usuarios</string> <list>

Anexo 1: Detalles del protocolo de comunicación XML

33

<map> <entry> <string>id</string> <int> Id de usuario</int> </entry> <entry> <string>telefono</string> <string> Teléfono de usuario </string> </entry> <entry> <string>nombre</string> <string> Nombre de usuario </string> </entry> <entry> <string>dni</string> <string> Dni de usuario </string> </entry> </map> <map> … </map> … </list> </entry> </map> Eliminar usuario (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>eliminar_usuario</string> </entry> <entry> <string>id</string> <int> Id de usuario </int> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> </map>

Anexo 1: Detalles del protocolo de comunicación XML

34

Registrar firma a deber (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>registrar_firma_a_deber</string> </entry> <entry> <string>id_doc</string> <int> Id de documento asociado a firma a deber</int> </entry> <entry> <string>id_usu</string> <int> Id de usuario asociado a firma a deber</int> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int>Código de respuesta del servidor</int> </entry> <entry> <string>inserciones</string> <int>Número de inserciones realizadas </int> </entry> </map> Recuperar firma a deber (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>recuperar_firma_a_deber_a</string> </entry> <entry> <string>id_doc</string> <int> Id de documento asociado a firma a deber</int> </entry> <entry> <string>id_usu</string> <int> Id de usuario asociado a firma a deber</int> </entry> </map>

Anexo 1: Detalles del protocolo de comunicación XML

35

Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> <entry> <string>nom_usu</string> <string> Nombre de usuario asociado a firma a deber </string> </entry> <entry> <string>nom_doc</string> <string> Nombre de documento asociado a firma a deber </string> </entry> </map> Recuperar firmas a deber (usuario) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>recuperar_firmas_a_deber</string> </entry> <entry> <string>id_usu</string> <int> Id de usuario asociado a firma a deber </int> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> <entry> <string>firmas_a_deber</string> <list> <map> <entry> <string>nom_doc</string> <string> Nombre de documento asociado a firma a deber </string> </entry> <entry> <string>id_doc</string> <int> Id de documento asociado a firma a deber </int>

Anexo 1: Detalles del protocolo de comunicación XML

36

</entry> </map> <map> … </map> … </list> </entry> </map> Recuperar firmas a deber (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>recuperar_firmas_a_deber_a</string> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> <entry> <string>firmas_a_deber</string> <list> <map> <entry> <string>nom_usu</string> <string> Nombre de usuario asociado a firma a deber </string> </entry> <entry> <string>nom_doc</string> <string> Nombre de documento asociado a firma a deber </string> </entry> <entry> <string>id_usu</string> <int> Id de usuario asociado a firma a deber </int> </entry> <entry> <string>id_doc</string> <int> Id de documento asociado a firma a deber </int> </entry> </map> <map>

Anexo 1: Detalles del protocolo de comunicación XML

37

… </map> … </list> </entry> </map> Eliminar firma a deber (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>eliminar_firma_a_deber</string> </entry> <entry> <string>id_doc</string> <int> Id de documento asociado a firma a deber</int> </entry> <entry> <string>id_usu</string> <int> Id de usuario asociado a firma a deber</int> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> </map> Registrar firma (usuario) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>registrar_firma</string> </entry> <entry> <string>bytes</string> <byte-array>Bytes de fichero XML de firma en formato Base64 </byte-array> </entry> <entry> <string>id_usu</string>

Anexo 1: Detalles del protocolo de comunicación XML

38

<string> Id de usuario asociado a firma</string> </entry> <entry> <string>id_doc</string> <string> Id de documento asociado a firma </string> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int>Código de respuesta del servidor</int> </entry> <entry> <string>id</string> <int> Id de firma </int> </entry> <entry> <string>inserciones</string> <int>Número de inserciones realizadas </int> </entry> </map> Recuperar firma (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>recuperar_firma</string> </entry> <entry> <string>id</string> <int> Id de firma</int> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> <entry> <string>datos</string>

Anexo 1: Detalles del protocolo de comunicación XML

39

<byte-array> Bytes de fichero XML de firma en formato Base64 </byte-array> </entry> <entry> <string>nom_usu</string> <string> Nombre de usuario asociado a firma</string> </entry> <entry> <string>nom_doc</string> <string> Nombre de documento asociado a firma </string> </entry> <entry> <string>id_usu</string> <int> Id de usuario asociado a firma </int> </entry> <entry> <string>id_doc</string> <int> Id de documento asociado a firma </int> </entry> <entry> <string>fecha</string> <sql-timestamp> Fecha de firma </sql-timestamp> </entry> </map> Recuperar firmas (usuario) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>recuperar_firmas</string> </entry> <entry> <string>id_usu</string> <int> Id de usuario asociado a firma </int> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> <entry> <string>firmas</string> <list> <map> <entry> <string>id</string> <int> Id de firma </int> </entry>

Anexo 1: Detalles del protocolo de comunicación XML

40

<entry> <string>id_doc</string> <int> Id de documento asociado a firma </int> </entry>

<entry> <string>nom_doc</string> <string> Nombre de documento asociado a firma </string> </entry> <entry> <string>fecha</string> <sql-timestamp> Fecha de firma </sql-timestamp> </entry> </map> <map> … </map> … </list> </entry> </map> Recuperar firmas (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>recuperar_firmas_a</string> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> <entry> <string>firmas</string> <list> <map> <entry> <string>nom_usu</string> <string> Nombre de usuario asociado a firma </string> </entry> <entry> <string>nom_doc</string> <string> Nombre de documento asociado a firma </string> </entry>

Anexo 1: Detalles del protocolo de comunicación XML

41

<entry> <string>id</string> <int> Id de firma </int> </entry>

<entry> <string>id_usu</string> <int> Id de usuario asociado a firma </int> </entry> <entry> <string>id_doc</string> <int> Id de documento asociado a firma </int> </entry> <entry> <string>fecha</string> <sql-timestamp> Fecha de firma </sql-timestamp> </entry> </map> <map> … </map> … </list> </entry> </map> Eliminar firma (administrador) Datos de petición para el servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>accion</string> <string>eliminar_firma</string> </entry> <entry> <string>id</string> <int> Id de firma</int> </entry> </map> Datos de respuesta del servidor <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>codigoError</string> <int> Código de respuesta del servidor </int> </entry> </map>

Anexo 1: Detalles del protocolo de comunicación XML

42

La firma digital se basa en un fichero XML que deberá generar el cliente con la siguiente estructura: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry> <string>documento</string> <byte-array> Bytes de fichero documento a firmar en formato Base64 </byte-array> </entry> <string>certificado</string> <byte-array> Bytes de fichero certificado de usuario firmante en formato Base64 </byte-array> </entry> <entry> <string>firma</string> <byte-array> Bytes de firma en formato Base64 </byte-array> </entry> </map>

Anexo 2: Capturas de la aplicación

43

Anexo 2: Capturas de la aplicación En este anexo se muestran algunas capturas de la aplicación funcionando. 1. Capturas del servidor en Netbeans

Anexo 2: Capturas de la aplicación

44

Anexo 2: Capturas de la aplicación

45

2. Capturas del cliente java administrador

Anexo 2: Capturas de la aplicación

46

Anexo 2: Capturas de la aplicación

47

Anexo 2: Capturas de la aplicación

48

Anexo 2: Capturas de la aplicación

49

Anexo 2: Capturas de la aplicación

50

3. Capturas del cliente java usuario

Anexo 2: Capturas de la aplicación

51

Anexo 2: Capturas de la aplicación

52

Anexo 2: Capturas de la aplicación

53

Anexo 2: Capturas de la aplicación

54

Anexo 2: Capturas de la aplicación

55

Anexo 2: Capturas de la aplicación

56

4. Capturas del cliente usuario Android

Anexo 2: Capturas de la aplicación

57

Anexo 2: Capturas de la aplicación

58

Anexo 2: Capturas de la aplicación

59

Anexo 2: Capturas de la aplicación

60

Anexo 2: Capturas de la aplicación

61

Anexo 2: Capturas de la aplicación

62

Anexo 2: Capturas de la aplicación

63

Anexo 2: Capturas de la aplicación

64

Este documento esta firmado porFirmante CN=tfgm.fi.upm.es, OU=CCFI, O=Facultad de Informatica - UPM,

C=ES

Fecha/Hora Wed Jul 04 23:36:47 CEST 2018

Emisor delCertificado

[email protected], CN=CA Facultad deInformatica, O=Facultad de Informatica - UPM, C=ES

Numero de Serie 630

Metodo urn:adobe.com:Adobe.PPKLite:adbe.pkcs7.sha1 (AdobeSignature)