Cómo iniciar sesión en la sucursal electrónica de BAC Credomatic utilizando Firma Digital desde GNU/Linux

El BAC San José permite iniciar sesión con Firma Digital desde Linux aunque solo ofrezcan instaladores para Windows y macOS. Esta guía explica cómo lograrlo sin requerir intérpretes o emuladores de otros sistemas.

Se requiere de los siguientes paquetes:

  • p7zip
  • unzip
  • procyon-decompiler
  • OpenJDK 8 (JRE y JDK)

Solo para Debian: en el caso de Debian no está disponible OpenJDK 8, se recomienda este procedimiento para agregar un repositorio que le da buen mantenimiento:

wget http://www.mirbsd.org/~tg/Debs/sources.txt/wtf-bookworm.sources
sudo mkdir -p /etc/apt/sources.list.d
sudo mv wtf-bookworm.sources /etc/apt/sources.list.d/
sudo apt update
sudo apt install openjdk-8-jdk

Descarga del instalador BACFirma

Cuando accede a la sucursal electrónica, tiene opción para iniciar sesión con usuario y contraseña, o bien con usuario y Firma Digital. Cuando elige esta segunda opción, tras unos segundos de espera, si no se ha iniciado la herramienta, aparecerá la opción para descargarla. Eso le lleva al sitio web https://static.sucursalelectronica.com/ donde un script lo redirige a la descarga según el sistema operativo que detecte. En el caso de GNU/Linux comenzará a descargar el instalador para Windows, pero es más conveniente cancelar esa descarga, la guía explica cómo hacerlo con el instalador para macOS, que es más fácil de descomprimir y de parchear.

Descarga de BACFirma para macOS

En la página que se abrió para la descarga que se sugirió cancelar, puede presionar control+U o hacer clic secundario en la página y elegir “Ver código fuente” de la página. En el código fuente, aproximadamente a partir de la línea 31 puede observarse cómo detecta el sistema operativo y el código decide si descargar la versión para macOS o la versión para Windows. En el momento de escribir esto, la versión para macOS del instalador es la 3.0.2, que puede descargarse por conveniencia directamente en el enlace a continuación: https://static.sucursalelectronica.com/BACFirma-3.0.2.dmg.

Desempaquetado del componente bacdesktop.jar

Se va a desempaquetar todo el contenido del JAR que contiene la imagen DMG. La razón de esto es que el fichero bacdesktop.jar falla al ejecutarse en GNU/Linux por un pequeño defecto al no encontrar un comando que en teoría debía prevenir la ejecución de procesos duplicados pero que en la práctica no funciona, al menos tal y como está implementado en el siguiente parche, pero al menos no llena de líneas de error los logs de la aplicación. La descompresión completa del JAR en lugar de únicamente la clase a desempaquetar se debe a que al compilar debe encontrar las dependencias del classpath y lo más práctico era desempaquetar el JAR entero que selectivamente todo el árbol de dependencias.

Una vez descargado, asumiendo que está ubicado en la carpeta estándar de descargas, abra una ventana de terminal e ingrese:

cd $(xdg-user-dir DOWNLOAD)
7z x BACFirma-3.0.2.dmg
cd "BACFirma-3.0.2/BAC Firma.app/Contents/Java"
unzip bacdesktop.jar

El siguiente comando puede variar el nombre. En algunas distribuciones se llama procyon y en otras procyon-decompiler. Ajustar según requiera:

procyon-decompiler net/bac/desktop/runtime/util/TaskManagerUtil.class -o .

Ese comando generará el fichero TaskManagerUtil.java en la misma carpeta que el fichero TaskManagerutil.class.

Corrección de código que falla en GNU/Linux

Abrir con algún editor el fichero net/bac/desktop/runtime/util/TaskManagerUtil.java. Por ejemplo:

gnome-text-editor net/bac/desktop/runtime/util/TaskManagerUtil.java

Buscar este texto, líneas 46 y 47, dentro del método killLastPid():

        }
        Runtime.getRuntime().exec(taskToKill);

Y entre ese par de líneas, agregar las tres siguientes:

        else if (OSValidator.isUnix()) {
            taskToKill = new String[] { "/bin/sh", "-c", "'kill", this.loadPidFile() + "'" };
        }

Para que quede así:

        }
        else if (OSValidator.isUnix()) {
            taskToKill = new String[] { "/bin/sh", "-c", "'kill", this.loadPidFile() + "'" };
        }
        Runtime.getRuntime().exec(taskToKill);

Guardar cambios y cerrar el editor de texto.

Para compilar, si tiene más de un JDK de java y más de un comando javac, en lugar de cambiar la configuración temporalmente, puede ver la ruta a javac de la versión 8 (puede aparecer como 1.8.0) con el comando: update-alternatives --list javac en distribuciones tipo Debian, mientras que en distribuciones tipo RPM el comando sería alternatives --list | grep javac y utilizar la ruta completa para compilar en lugar del comando corto si el comando javac no fuera la 8 (consultable con el comando javac -version).

Seguidamente, compilar mediante el comando:

javac net/bac/desktop/runtime/util/TaskManagerUtil.java

No debería aparecer ningún mensaje de error al compilar.

A continuación, se incopora el .class modificado en el JAR mediante el comando:

jar -uf bacdesktop.jar net/bac/desktop/runtime/util/TaskManagerUtil.class

Creación del lanzador para el manejo del protocolo personalizado

Para crear un lanzador que sirva para todos los usuarios, incluso para los nuevos que se creen posterior a la aplicación de los pasos de esta guía, requiere privilegios de superusuario. En este caso se utiliza el comando sudo que viene preinstalado en Debian 12. Si no se tuvieran privilegios de superusuario, los ficheros se puede crear en rutas dentro de /home/sunombredeusuario/.local/share en lugar de /usr/share y quitar el sudo de los comandos indicados.

En este ejemplo se utiliza una ruta java asumiendo que el predeterminado es la 8. Si no fuera la 8, puede utilizarse una ruta absoluta a la versión 8, reemplazando java con algo como por ejemplo en Debian sería /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java o en Fedora /usr/lib/jvm/java-1.8.0/bin/java y luego todo lo demás de -jar y la ruta donde se ubique el JAR, sin olvidar el %u del final de la línea.

Copiar el JAR en una carpeta común para todos los usuarios:

sudo mkdir -p /usr/share/bacfirma/
sudo cp bacdesktop.jar /usr/share/bacfirma/

A continuación, crear un fichero bacfirma.desktop en /usr/share/applications y abrirlo con un editor:

sudo gnome-text-editor /usr/share/applications/bacfirma.desktop

En el editor, pegar el siguiente texto. Ajustar la línea de Exec= si fuera necesario para los casos particulares explicados anteriormente:

[Desktop Entry]
Type=Application
Name=BAC Firma
Exec=java -jar /usr/share/bacfirma/bacdesktop.jar %u
NoDisplay=true
Terminal=false
SingleMainWindow=true
MimeType=x-scheme-handler/bacdesktop

Guardar cambios y cerrar.

Consideraciones finales

Es importante indicar que la aplicación BAC Firma busca la librería de las tarjetas de Firma Digital en la ruta /usr/lib/libASEP11.so, por lo que si no existiera, debe crearse un enlace simbólico o una copia desde otra ubicación, por ejemplo sudo ln -sf /usr/lib/x64-athena/libASEP11.so /usr/lib para que funcione. En otras guías de instalación en este sitio web se suele realizar la creación de un conjunto de enlaces simbólicos para que herramientas como esta funcionen.

Normalmente el siguiente comando no es necesario en muchas distribuciones, pero permitirá actualizar el cache de la base de datos de tipos MIME si por alguna razón se requiriera:

sudo update-desktop-database

Eso es todo, ya debería funcionar en el navegador al ingresar con Firma Digital en el sitio web del BAC. El navegador preguntará si desea abrir un enlace con BAC Firma, puede opcionalmente marcar la casilla para permitir siempre que ese sitio lance la herramienta sin preguntar cada vez y aceptar. Finalmente aparecerá la ventana solicitando el PIN de la tarjeta.

Para explicar qué hace este fichero .desktop, es un estándar para creación de lanzadores en diferentes entornos de escritorio, se puede consultar detalladamente el significado de cada línea buscando “Desktop Entry Specification” en FreeDesktop.org. Este lanzador no tiene icono (aunque se le podría agregar para verlo en el alternador de tareas mientras está la ventana abierta, pero probablemente no merece la pena) ni se ejecuta desde la lista de aplicaciones, esto se indica explícitamente con el NoDisplay=true porque no funciona lanzándose de manera manual, solo parametrizado con la información a firmar. Lo que hace es ejecutarse cuando un sitio web invoca a un protocolo cuya URI comienza por “bacdesktop:” y cuyo valor se pasa como parámetro al comando indicado en ese fichero, en particular donde está el parámetro %u del valor correspondiente a la línea Exec=. La línea MimeType= es la que crea un manejador bacdesktop mediante el tipo MIME especial x-scheme-handler que permite definirlo y así queda asociado el lanzador para ese nombre de protocolo personalizado.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *