ctt-gob-es / clienteafirma

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

Autofirma 1.7.1: Error CORS tras actualización de Chrome Versión 98.0.4758.82 (Build oficial) (64 bits) #238

Open vjimenez03 opened 2 years ago

vjimenez03 commented 2 years ago

Buenas tardes,

tras actualizar todos los clientes la versión de Chrome a 98.0.4758.82 ha dejado de funcionar la comunicación con Autofirma lanzada mediante custom protocol: afirma://service?ports=53397,57378,62508&v=1&idsession=UJUBCPTNDiOj049I1tcy

El error sólo se produce en esta versión de Chrome, funciona correctamente con las últimas versiones de Edge, Firefox y versiones anteriores de Chrome.

image

image

pasqualm commented 2 years ago

Parece que el problema se puede esquivar configurando una de estas politicas: https://chromeenterprise.google/policies/#InsecurePrivateNetworkRequestsAllowed https://chromeenterprise.google/policies/#InsecurePrivateNetworkRequestsAllowedForUrls

vjimenez03 commented 2 years ago

Ya, añadiendo InsecurePrivateNetworkRequestsAllowed funciona. Es una solución temporal que puedo aplicar yo o una organización. Pero no puedo pedirle a un usuario de una web del Estado o de un Organismo público que se modifique el registro de seguridad de su sistema operativo (windows, linux, macos, ...) para permitir el acceso a urls no seguras.

albfernandez commented 2 years ago

Si se tienen configurados los servidores intermedios (por ejemplo para permitir firmas desde Android), se puede forzar a Chrome 98+ y superiores a usar los servidores intermedios , en cuyo caso no se produce este error y permite la firma

MiniApplet.setForceWSMode(true);

o si se usa AutoScript

AutoScript.setForceWSMode(true);

En resumen, Chrome 98 falla en el modo socket, pero si usamos el modo de servidores intermedios funciona

Nota: También afectará a Edge 98 cuando salga

Gamuci commented 2 years ago

Buenos días,

He comprobado que el nuevo mecanismo de comunicación basado en WebSockets funciona sin necesidad de hacer ningún cambio en la configuración de los equipos ni modificaciones en las aplicaciones. Sólo es necesario que la aplicación utilice el último JavaScript de despliegue (autoscript.js): https://administracionelectronica.gob.es/ctt/clienteafirma/descargas#.YfzSrPmZNPY

Este JavaScript es el antiguo "miniapplet.js" renombrado. Basta que le pongáis el nombre con el que lo tuvieseis integrado en vuestra aplicación y que sustituyáis un fichero por otro.

vjimenez03 commented 2 years ago

Buenas tardes,

Sí, hemos comprobado también la solución forzando el mecanismo de comunicación basado en WebSockets con autoscript.js y funciona correctamente con Google Chrome 98 para AutoFirma 1.71 o superior

En MacOs sigue fallando debido a que AutoFirma continua con la versión 1.6.5

Muchas Gracias

Gamuci commented 2 years ago

Buenas tardes,

Se acaba de publicar AutoFirma 1.7.1 para Linux y macOS. Esta versión ya permitiría a los usuarios utilizar Chrome v98.

La versión de macOS, sin embargo, tiene un problema con la instalación en Monterrey. El sistema no habilita la confianza en el certificado SSL "AutoFirma ROOT" durante la instalación, así que lo tendría que hacer el usuario accediendo al llavero, haciendo doble clic sobre este certificado y cambiando la configuración del campo “Al utilizar este certificado” al valor “Confiar siempre”. Se está trabajando en el instalador para que pueda hacer sólo este proceso. Esperamos que pronto se pueda publicar una nueva versión que ya corrija el problema.

vjimenez03 commented 2 years ago

Muchas gracias de nuevo.

Probado en macOS Big Sur y macOS Moterrey. La solución basada en WebSockets y autoscript.js funciona correctamente.

Nota: Edge se acaba de actualizar a la versión 98.

image

albfernandez commented 2 years ago

Para ciudadanos, versión breve

Tener siempre la última versión de Autofirma instalada. Usar Internet Explorer o Firefox en las administraciones que aún no estén adaptadas hasta que se adapten.

Para integradores de la administración, versión breve

Actualizar a la última versión de autoscript

Para ciudadanos, versión larga

Tener siempre la última versión de Autofirma instalada.

Si intentamos firmar en una administración que aún no se ha adaptado, la solución más simple es usar Internet Explorer hasta que se solucione. Se puede usar Firefox, pero si no lo usamos habitualmente será necesario importar los certificados personales y puede que reinstalar autofirma (Firefox usa un almacén de certificados independiente. Explorer, Chrome y Edge usan el almacén de Windows)

Eliminar comprobación de seguridad en Chrome

Esta solución desactiva una comprobación de seguridad en Chrome Aunque la comprobación de seguridad de momento está en pruebas y no está completamente activa, "rompe" Autofirma. Si aplicamos la solución descrita es muy recomendable que pasado un tiempo la desactivemos. Hay soluciones más restrictivas y seguras como indicar la lista de sitios con la directiva InsecurePrivateNetworkRequestsAllowedForUrls , pero dado que la protección aún no es realmente activa aún, y que indicar las urls es mas tedioso, explicaré como configurar la directiva InsecurePrivateNetworkRequestsAllowed.

Insisto : Solución provisional que desactiva una comprobación de seguridad: hay que deshacerla una vez que las administraciones con las que trabajemos se vayan actualizando

Chrome en Windows

Si queremos usar Chrome, y no nos da miedo enredar en el registro, podemos aplicar la solución provisional propuesta en Junta de Andalucia

Sería copiar este texto, pegarlo en un archivo vacío y llamarlo autofirma_fix_98.reg, y luego ejecutarlo y confirmar que estamos seguros, cerrar el navegador y ya estaría.

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]
"InsecurePrivateNetworkRequestsAllowed"=dword:00000001

Chrome en Linux

Como root, crear los directorios de políticas de Chrome

mkdir -p /etc/opt/chrome/policies/managed
mkdir -p /etc/opt/chrome/policies/recommended

y luego crear un fichero /etc/opt/chrome/policies/managed/managed_policies.json

Con el siguiente contenido

{
"InsecurePrivateNetworkRequestsAllowed": true
}

Chromium en Linux

como root crear los directorios de políticas de Chromium

mkdir -p /etc/chromium/policies/managed
mkdir -p /etc/chromium/policies/recommended

y luego crear un fichero /etc/chromium/policies/managed/managed_policies.json

Con el siguiente contenido

{
"InsecurePrivateNetworkRequestsAllowed": true
}

Para integradores de la administración pública, versión larga

La solución definitiva sería utilizar los últimos scripts de autoscript.

Si tenemos configurados servidores intermedios (necesarios para firmar con dispositivos móviles) una solución rápida para aplicar mientras se planifica con mas tiempo utilizar los últimos scripts de autoscript es forzar el uso de servidores intermedios para Chrome y Edge 98. OJO: tenemos que tener ya configurados correctamente los servidores intermedios para que esto funcione. Si no los tenemos configurados quizás sea más rápido actualizar a la última versión de autoscript

Editamos nuestro MiniApplet.js o Autoscript.js, y buscamos la siguiente linea de código

if (!forceWSMode && !isIOS() && !isAndroid() && !isOldInternetExplorer() && !isEdge() && !isSafari10()){

y modificarla de forma que quede así:

// Detectamos Chrome 98 y superior (vale para todos los derivados: Edge, Chromium, Opera, etc)

var isChrome98= navigator.userAgent.indexOf("Chrome/98")  > 0 || navigator.userAgent.indexOf("Chrome/99") > 0 || navigator.userAgent.indexOf("Chrome/1") > 0;

if (!forceWSMode && !isIOS() && !isAndroid() && !isOldInternetExplorer() && !isEdge() && !isSafari10() && !isChrome98){

De tal forma que al final nos queda así. Con lo que forzamos el uso de servidores intermedios para Chrome y Edge 98 y superiores. Es más lento que la comunicación por socket, pero nos vale provisionalmente hasta que actualicemos autoscript

var isChrome98 = navigator.userAgent.indexOf("Chrome/98")  > 0 || navigator.userAgent.indexOf("Chrome/99") > 0 || navigator.userAgent.indexOf("Chrome/1") > 0;

if (!forceWSMode && !isIOS() && !isAndroid() && !isOldInternetExplorer() && !isEdge() && !isSafari10() && !isChrome98){
    clienteFirma = new AppAfirmaJSSocket(clientAddress, window, undefined);
    clienteFirma.setKeyStore(keystore);
    clientType = TYPE_JAVASCRIPT_SOCKET;
}
else {
    clienteFirma = new AppAfirmaJSWebService(clientAddress, window, undefined);
    clienteFirma.setKeyStore(keystore);
    clientType = TYPE_JAVASCRIPT_WEB_SERVICE;
}
imorales commented 2 years ago

Buenos días,

hemos visto que se ha publicado en https://firmaelectronica.gob.es/Home/Descargas.html la versión 1.7.2

¿pueden confirmar si esta versión corrige lo indicando en este ticket?

Muchas gracias.

albfernandez commented 2 years ago

Buenos días,

hemos visto que se ha publicado en https://firmaelectronica.gob.es/Home/Descargas.html la versión 1.7.2

¿pueden confirmar si esta versión corrige lo indicando en este ticket?

Muchas gracias.

Hola

La solución del problema depende de dos partes:

  1. Autofirma, resuelto en la versión 1.7.0
  2. El script (autoscript.js) desplegado en la administración correspondiente. Es necesario que la administración en la que quieras firmar hayan actualizado la parte del servidor también a la version 1.7
imorales commented 2 years ago

Gracias @albfernandez , en este caso lo consultaba desde el punto de vista de la administración. Pasaré nota a nuestros proveedores para que actualicen el script. Muchas gracias.

enriqueartal commented 2 years ago

En Linux (Fedora 35) no funciona autofirma en Chrome pero sí en Firefox (tanto 1.6.5 como 1.7.1); no sé si el problema es de mi equipo o de la web de mi universidad. Ya he perdido la esperanza de que funcione con el DNIe, tanto en web como en la aplicación.

ratorna commented 2 years ago

En Linux (Fedora 35) no funciona autofirma en Chrome pero sí en Firefox (tanto 1.6.5 como 1.7.1); no sé si el problema es de mi equipo o de la web de mi universidad. Ya he perdido la esperanza de que funcione con el DNIe, tanto en web como en la aplicación.

Con certificado software instalado en KDE Neon a mí tampoco me funciona en chrome, ni la 1.6.5 ni la 1.7.1

ratorna commented 2 years ago

la versión 1.7.2 no soluciona el error en windows

rafonsoavantic commented 2 years ago

Hola @albfernandez en tu comentario defines la variable var isCrome98 (sin 'h') y en el if la referencias como isChrome98 (con 'h') Un saludo.

Para ciudadanos, versión breve

Tener siempre la última versión de Autofirma instalada. Usar Internet Explorer en las administraciones que aún no estén adaptadas hasta que se adapten.

Para integradores de la administración, versión breve

Actualizar a la última versión de autoscript

Para ciudadanos, versión larga

Tener siempre la última versión de Autofirma instalada.

Si intentamos firmar en una administración que aún no se ha adaptado, la solución más simple es usar Internet Explorer hasta que se solucione. Se puede usar Firefox, pero si no lo usamos habitualmente será necesario importar los certificados personales y puede que reinstalar autofirma (Firefox usa un almacén de certificados independiente. Explorer, Chrome y Edge usan el almacén de Windows)

Si queremos usar Chrome, y no nos da miedo enredar en el registro, podemos aplicar la solución provisional propuesta en Junta de Andalucia

Ojo! esta opción desactiva una opción de seguridad. De momento está en pruebas y no será efectiva hasta dentro de al menos 3 meses (mayo 2022). Durante ese tiempo es igual de seguro activarla que desactivarla. Es recomendable que pasado ese tiempo borrar la clave.

Sería copiar este texto, pegarlo en un archivo vacío y llamarlo autofirma_fix_98.reg, y luego ejecutarlo y confirmar que estamos seguros, cerrar el navegador y ya estaría.

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]
"InsecurePrivateNetworkRequestsAllowed"=dword:00000001

Para integradores de la administración pública, versión larga

La solución definitiva sería utilizar los últimos scripts de autoscript.

Si tenemos configurados servidores intermedios (necesarios para firmar con dispositivos móviles) una solución rápida para aplicar mientras se planifica con mas tiempo utilizar los últimos scripts de autoscript es forzar el uso de servidores intermedios para Chrome y Edge 98. OJO: tenemos que tener ya configurados correctamente los servidores intermedios para que esto funcione. Si no los tenemos configurados quizás sea más rápido actualizar a la última versión de autoscript

Editamos nuestro MiniApplet.js o Autoscript.js, y buscamos la siguiente linea de código

if (!forceWSMode && !isIOS() && !isAndroid() && !isOldInternetExplorer() && !isEdge() && !isSafari10()){

y modificarla de forma que quede así:

// Detectamos Chrome 98 y superior (vale para todos los derivados: Edge, Chromium, Opera, etc)

var isCrome98 = navigator.userAgent.indexOf("Chrome/98")  > 0 || navigator.userAgent.indexOf("Chrome/99") > 0 || navigator.userAgent.indexOf("Chrome/1") > 0;

if (!forceWSMode && !isIOS() && !isAndroid() && !isOldInternetExplorer() && !isEdge() && !isSafari10() && !isChrome98){

De tal forma que al final nos queda así. Con lo que forzamos el uso de servidores intermedios para Chrome y Edge 98 y superiores. Es más lento que la comunicación por socket, pero nos vale provisionalmente hasta que actualicemos autoscript

var isCrome98 = navigator.userAgent.indexOf("Chrome/98")  > 0 || navigator.userAgent.indexOf("Chrome/99") > 0 || navigator.userAgent.indexOf("Chrome/1") > 0;

if (!forceWSMode && !isIOS() && !isAndroid() && !isOldInternetExplorer() && !isEdge() && !isSafari10() && !isChrome98){
  clienteFirma = new AppAfirmaJSSocket(clientAddress, window, undefined);
  clienteFirma.setKeyStore(keystore);
  clientType = TYPE_JAVASCRIPT_SOCKET;
}
else {
  clienteFirma = new AppAfirmaJSWebService(clientAddress, window, undefined);
  clienteFirma.setKeyStore(keystore);
  clientType = TYPE_JAVASCRIPT_WEB_SERVICE;
}
enriqueartal commented 2 years ago

¿Cómo queda la versión larga para ciudadanos con Linux?

albfernandez commented 2 years ago

Hola @albfernandez en tu comentario defines la variable var isCrome98 (sin 'h') y en el if la referencias como isChrome98 (con 'h') Un saludo.

gracias por el aviso, comentario editado

albfernandez commented 2 years ago

¿Cómo queda la versión larga para ciudadanos con Linux?

Hola @enriqueartal

Te contesto , he probado como configurar la política en Chrome 98

Como root, creas los directorios de políticas de Chrome

mkdir -p /etc/opt/chrome/policies/managed
mkdir -p /etc/opt/chrome/policies/recommended

y luego crear un fichero /etc/opt/chrome/policies/managed/managed_policies.json

Con el siguiente contenido

{
"InsecurePrivateNetworkRequestsAllowed": true
}

Nota: Simplemente he probado a definir la política y que Chrome la carga, lo puedes ver en chrome://policy pero no he probado ninguna firma en una administración que falle.

Visita chrome://policy y ahi debería aparecer sin necesidad de reiniciar el navegador

Para chromium el proceso es el mismo pero el fichero tiene que llamarse /etc/chromium/policies/managed/managed_policies.json

enriqueartal commented 2 years ago

¡Muchas gracias! He podido firmar un documento de prueba. ¿Cómo de inseguro es?

albfernandez commented 2 years ago

¡Muchas gracias! He podido firmar un documento de prueba. ¿Cómo de inseguro es?

@enriqueartal

Básicamente la nueva protección es bloquear o controlar de alguna forma que un javasript alojado en una página de internet pueda hacer peticiones a tu intranet.

Un ejemplo: visitas desde tu casa a una web maliciosa de internet que tiene un javascript que envía peticiones a tu router. Ese tipo de llamadas solo se pueden hacer desde un equipo de la red interna de tu casa, en este caso tu navegador. En este ejemplo de ataque intentarían adivinar las credenciales de tu router para poder controlarlo o infectarlo.

De momento ningún navegador -que yo sepa- te protege, ni si quiera Chrome: La funcionalidad aún está en pruebas pero realmente no hace el bloqueo, al menos en unos 4 meses no lo van a activar del todo. Durante ese tiempo , en cuanto a seguridad , te da igual que configuración de políticas tengas, y pasado ese tiempo espero que todas las administraciones se hayan actualizado para que la puedas eliminar

quique commented 1 year ago

Al lanzar autofirma "afirma://service?ports=64117&v=1&idsession=deadbeef" se mostraba este error:

java.lang.IllegalArgumentException: Cannot support TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 with currently installed providers

Tras instalar una versión más reciente de Java (la 17) ha dejado de salir el error, y ya he podido firmar desde el navegador (Firefox en mi caso).