Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Soporte para uso de AutoFirma mediante JNLP y para firma de varios documentos por petición #2

Open
wants to merge 11 commits into
base: master
Choose a base branch
from

Conversation

pacoual
Copy link

@pacoual pacoual commented Apr 22, 2016

Se han realizado modificaciones en AutoFirma

1. Invocación de AutoFirma mediante Java Web Start

Permite la invocación de AutoFirma mediante la descarga de un fichero JNLP en el navegador o el uso del protocolo jnlp://

De esta manera el usuario no necesita tener instalado AutoFirma y podemos tener una operatoria similar al lanzamiento de Applets

Para poder realizar la comunicación mediante sockets se incluye el afirma-ui-simple-configurator si se hace invocación por servicio afirma://service

Ejemplo de invocación
var storage = document.getElementById('storageService').value;
var retrieve = document.getElementById('retrieveService').value;
var jnlp = document.getElementById('jnlpService').value;
MiniApplet.setServlets(storage, retrieve);
MiniApplet.setJnlpService (jnlp); // URL donde esta el generador de JNLP
if (navigator.platform.indexOf("Linux")!=-1 || navigator.platform.indexOf("Mac")!=-1){
//En Mac y Linux se fuerza la utilización de servidores intermedios
MiniApplet.setForceWSMode(true);
}
MiniApplet.cargarAppAfirma('sign/miniapplet.js');

Para la detección del protocolo jnlp:// se ha utilizado la librería https://github.com/sticual/custom-protocol-detection

Un ejemplo de servidor de jnlp se puede encontrar en https://github.com/sticual/AutoFirmaJWS

ejemplo de llamada jnlp

jnlp://servidor:puerto/AutoFirmaJWS/Autofirma.jnlp?cadenafirma=afirma%3A%2F%2Fsign...

2. Firma de varios documentos en una sola petición

Se ha modificado el método MiniApplet.sign para que acepte un array de operaciones del modo:

operacion1;dato1:operacion2;dato2......operacionN;datoN

La respuesta de este sera un array de firmas en lugar de una firma única

Lo primero es que AutoFirma pueda recibir y tratar una cadena de datos de firma con sus operaciones correspondientes. Para ello hemos modificado la clase UrlParameters donde se parsean los parámetros pasados en la URL de invocación a AutoFirma.

Se ha añadido dos arrays, uno va al almacenar los datos a firmar en byte y el otro las operaciones (sign, cosign o countersign) para cada uno de los registros del primer array.

Durante este proceso de composición de los arrays, si alguna dupla operación-dato de los que tiene que venir en el parámetro de entrada, no contiene la operación, se toma por defecto la del método invocado. Es decir, si se está llamando con Mniapplet.sign(…), se tomará sign como método de firma, si es Miniapplet.cosign(…), se tomará cosign y si es Miniapplet.countersign(…), se tomará countersign.

A continuación se ha modificado AutoFirma para que pueda ejecutar las firmas en bucle con el certificado seleccionado. Para ello se ha modificado la clase ProtocolInvocationLauncherSign

Hasta ahora el resultado se guardaba en un objeto de tipo byte, ahora dicho objeto es un array de byte. El resultado de la firma se puede devolver cifrado, si el parámetro Deskey no es nulo, o en B64.

En cualquiera de los dos casos, lo que se devuelve es una cadena con todas las firmas realizadas, separadas por “:”.

Esperamos que los cambios sean de su agrado y estamos a la espera ante cualquier duda o comentario que quieran realizar

Saludos

@Gamuci
Copy link
Contributor

Gamuci commented May 24, 2016

Buenas tardes,

El encapsulado JNLP es un aporte muy interesante. Ahora mismo estamos atendiendo otras tareas del proyecto pero en cuanto nos sea posible terminaremos de revisar lo que que habéis enviado para integrarlo en la aplicación.

En cuanto a la firma de múltiples datos mediante una única llamada, hay que darle vueltas sobre la forma en la que se podría incorporar y si sería conveniente hacerlo. Las funciones de firma que se han modificado son usadas por el resto de aplicaciones del Cliente @firma (MiniApplet, clientes móviles,...) y sería necesario actualizarlas todas para soportar esta funcionalidad. Por otra parte, ya existe un método para hacer lo mismo que describís sólo que de forma trifásica (signBatch()).

Un saludo,

 Carlos Gamuci

@Gamuci
Copy link
Contributor

Gamuci commented Feb 22, 2017

Se está haciendo ya la integración del despliegue JNLP pero, ya sea por cambios en Firefox o cualquier otro motivo, nos encuentramos con un problema con este navegador.

Cuando se carga por primera vez la aplicación WebStart se realiza la generación de los certificados e instalación de la CA con la que se emite el certificado SSL en los almacenes de confianza del sistema. Sin embargo, si Firefox está abierto (lo cual ocurre siempre si se utiliza este navegador), el certificado no se instala en su almacén de confianza y por tanto la comunicación por socket falla. Si se utiliza otro navegador la primera vez y Firefox está cerrado, el certificado se instala correctamente y, en consecuencia, en las siguientes ejecuciones no hay problema en usar Firefox.

¿No os habéis encontrado este problema al hacer el despliegue? ¿Es un problema que ha surgido a posteriori?

Un saludo,

 Carlos Gamuci

@pacoual
Copy link
Author

pacoual commented Feb 24, 2017

Buenas

Precisamente nos habíamos puesto a actualizar nuestro fork con vuestros últimos cambios porque hemos visto que a partir de Firefox 50 había dejado de funcionar la comunicación con sockets. Resulta que si esta abierto Firefox no permite modificar el almacén de certificados con la app certutil. Cuando usas otro navegador si instala el certificado correctamente.

Temporalmente hemos deshabilitado la comunicación con sockets para Firefox. Seguimos investigando alguna solución.

Saludos

@velasquezjc
Copy link

Yo estuve haciendo pruebas con firefox 52.1.1 y chrome 49 con SO windows xp ( a partir de una version anterior sin jnlp) y los sockets funcionan correctamente.Cree mi propia version de llamadas a jnlpr. Mi pregunta seria: (en mi contexto quizas necesite la comunicacion entre la app local y un server externo, para firma de multiples archivos mediante id,el server solo entrega y guarda archivos a partir del id, no hace preproceso ni nada, solo se concentra en esas dos funciones de forma segura). ¿Para que el server ande con la app local por https ,este CREO PERO NO ESTOY SEGURO que debe instalar el certificado generado por la app local en su truestore, pero al ser los certificados autogenerados siempre cambian para cadad instalacion, por lo que pregunto si no seria mejor crear un certificado y luego desde la app local levantarlo e instalarlo, en lugar de regenerarlo.?este certificado tendria la misma raiz que el del servidor externo. Osea a partir de un certificado raiz, crear otro para la aplicacion; de esta forma como ese certificado raiz ya va a estar instalado como de confianza en windows (porque se va a confiar en la pagina web qeu presta el servicio https,etc), cuando se intente instalar el certificado para la app local, como este va a tener raiz al del server ya de confianza, no se va a pedir la confirmacion del usuario en caso de instalacion del certificado de la app local en el repositorio de windows.

Slds,

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants