ctt-gob-es / clienteafirma

Cliente @firma
http://administracionelectronica.gob.es/ctt/clienteafirma
255 stars 119 forks source link

Error SAF_04, AutoFirma 1.6.5 (Linux) y autoscript.js (1.7) #221

Open fpuga opened 2 years ago

fpuga commented 2 years ago

Estoy haciendo una prueba de concepto para una pequeña aplicación web interna en la que quiero firmar documentos mediante el certificado de la FNMT.

Mi sistema operativo (y entorno de desarrollo), así como el de varias de las futuras usuarias es Linux, y por tanto usamos la versión 1.6.5 de Autofirma.

Estoy usando la versión de master ( 1222bbe ) de autoscript.js porqué no he visto tagueada la versión 1.7 ni he podido deducir cual sería el javascript equivalente en la 1.6.5.

Al montar una demo mínima, el navegador me da la opción de lanzar AutoFirma que se cierra con el error SAF_04. En la consola del navegador sale este mensaje:

Launched external handler for 'afirma://websocket?v=3'.
autoscript.js:1247 Creamos el cliente para el socket
autoscript.js:1213 WebSocket connection to 'wss://127.0.0.1:63117/' failed: 
createWebSocket @ autoscript.js:1213
waitAppAndProcessRequest @ autoscript.js:1250
autoscript.js:1226 Se cierra el socket
autoscript.js:1247 Creamos el cliente para el socket

Y en el log de AutoFirma sale (pego la parte relevante):

Pego sólo la parte que creo más relevante ```xml 2021-10-30T17:16:59.456018Z 1635614219456 18000 4 es.gob.afirma SEVERE es.gob.afirma.standalone.protocol.ProtocolInvocationLauncher launch 1 La operacion indicada en la URL no esta soportada: afirma://websocket?v=3... 2021-10-30T17:17:01.411432Z 1635614221411 432000 5 es.gob.afirma SEVERE es.gob.afirma.standalone.protocol.ProtocolInvocationLauncherErrorManager showError 1 Ha ocurrido un error realizando la operación. (SAF_04: Operación no soportada. Compruebe que dispone de la última versión de AutoFirma.) 2021-10-30T17:16:59.456018Z 1635614219456 18000 4 es.gob.afirma SEVERE es.gob.afirma.standalone.protocol.ProtocolInvocationLauncher launch 1 La operacion indicada en la URL no esta soportada: afirma://websocket?v=3... 2021-10-30T17:17:01.411432Z 1635614221411 432000 5 es.gob.afirma SEVERE es.gob.afirma.standalone.protocol.ProtocolInvocationLauncherErrorManager showError 1 Ha ocurrido un error realizando la operación. (SAF_04: Operación no soportada. Compruebe que dispone de la última versión de AutoFirma.) ```

Seguramente esté documentado pero tras varias vueltas (usar https en local, usar un alias en lugar de localhost, revisar el código de la app de escritorio y el log de cambios, ...) estoy bastante seguro de que el problema está en que la versión 1.7 de autoscript.js usa por defecto WebSockets y sólo usa un servicio intermedio o Sockets en ciertas circunstancias. Pero, la versión 1.6.5 (la última disponible para Linux) no tiene soporte para WebSockets, y por tanto se produce el error. De hecho tocando el código un poco para forzar el uso de Sockets funciona.

Ante esto veo varias soluciones, no incompatibles entre sí:

  1. La que creo que es ideal. Publicar la versión 1.7 para Linux y Mac. Para Windows salió en Mayo (hace 6 meses).
  2. Usar un parámetro para forzar el uso de Sockets igual que lo hay para forzar el uso de servicios intermedios. Lo que no me gusta mucho como solución porqué es derivar mucha responsabilidad hacia la implementadora para solucionar un problema puntual de compatibilidad de versiones. Aunque si la idea es mantener el soporte de Sockets bastante tiempo tampoco estaría de más.
  3. Si no hay previsión de sacar la 1.7 usar una guarda para intentar detectar Linux o Mac y usar Sockets. No me gusta mucho porqué detectar el sistema operativo desde JavaScript es poco fiable.
  4. Documentar claramente la situación, advirtiendo a implementadoras del problema y sugiriendo alguna acción. Y mejor que en la "Guía de implementadores" lo pondría en el README del repositorio.

Creo que las issues #71 #125 a pesar de ser antiguas pueden ser el mismo error.

En caso de que haya interés puedo preparar PR para los casos 2 y 3.

pedroprieto commented 2 years ago

Muy buenas,

Tenía justo el mismo problema que tú. ¡¡Muchas gracias por indicar la fuente del fallo!! :clap:

Una solución rápida para salir del paso consiste en modificar esta línea del script: https://github.com/ctt-gob-es/clienteafirma/blob/1222bbef9f64c68c9980ec266fc75c8635dd0eea/afirma-ui-miniapplet-deploy/src/main/webapp/js/autoscript.js#L113 Por:

return false;

Así fuerzas a que no se utilicen websockets :wink:

Lo estoy probando y parece que funciona bien. Mientras tanto a ver si sacan la versión 1.7 para Linux.

Un saludo!!

pedroprieto commented 2 years ago

Aunque supongo que ya lo habrás probado cuando has dicho lo de tocando un poco el código para forzar el uso de Sockets funciona :sweat_smile: ...

fpuga commented 2 years ago

Gracias @pedroprieto Mi apaño para salir del paso era parecido, pero el tuyo es más elegante.

Hacerlo así es una pena porqué pierdas la opción de WebSockets para el cliente desktop windows. Podríamos hacer un parche que de opción de configuración, pero si el equipo de clienteafirma no tiene recursos para integrarlo o optar por una solución mejor como publicar una nueva versión, habrá que tirar de workaround

afanjul commented 2 years ago

Hola, yo tengo instalado autofirma en mac y me sale el mismo error. He buscado por el fichero "autoscript.js" que comentáis, pero no lo encuentro por ningún lado (ni siquiera dentro de la .app).

Cómo puedo modificar la .app para que no me de este error?

fpuga commented 2 years ago

No tengo experiencia en Mac @afanjul lo siento. De todas formas ese fichero autoscript.js está en el servidor que no en tu aplicación instalada en local. Ese fichero es el que se encarga de que cuando quieres firmar algo en una página web, se acaba abriendo "de forma transparente" el AutoFirma instalado en local y puedas firmas.

afanjul commented 2 years ago

Ok, entendido. Aprovecho para hacer otra pregunta, yo juraría que antes (posiblemente antes de cambiar o tocar algo), a la hora de acceder a algún trámite que requería de certificado, el propio navegador (chrome o firefox) me solicitaba el certificado en una ventanita (integrada), pero ahora me salta la aplicación de autofirma y desde ahí me permite elegir el certificado. Es posible que este cambio haga que me salga ese error al no soportar websockets y demás.

Sabéis la forma de configurar cómo se selecciona el certificado? (si por navegador o a través de autofirma) ?

gracias

pedroprieto commented 2 years ago

Buenas,

Como comenta @fpuga , el problema que hemos comentado está en el script del servidor, es decir, en el sitio web que te pida la firma. Solamente te interesa si vas a implementar tú mismo la funcionalidad de firma electrónica en un servidor web controlado por ti.

Con respecto a tu segunda pregunta, creo que te refieres a lo siguiente:

Si se te abre autofirma en el primer caso desconozco el motivo...

En cuanto a la selección del certificado, el navegador suele guardar el último que hayas utilizado. Si quieres volver a elegirlo la opción más sencilla es acceder al sitio web a través de la opción de navegación privada del navegador. Otra opción sería borrar el historial del navegador de ese sitio web.

Un saludo!!

lardeson commented 2 years ago

Buenas,

Disculpen que pregunte lo mismo que ya hicieron anteriormente. Tengo un problema parecido con Autofirma que no se conecta al navegador cuando quiero firmar un documento FNMT. El tema es que no se como funcionar la integracion del archivo autoscript.js.

Gracias de antemano

pedroprieto commented 2 years ago

Buenas,

Si el problema es que no te funciona Autofirma al firmar un documento en algún sitio web oficial, entonces este tema no está relacionado.

Un saludo!