… un poco a lo bestia pero se puede.
Esta entrada pretende ser mi punto de referencia para cuando precise volver a instalar todo el montaje y ser capaz de interactuar con la sede electrónica de la Agencia Tributaria.
Entonces, ¿ se puede usar el cliente @firma con Debian ? No. No se puede. Al menos con la versión Wheezy de Debian y con las últimas versiones de Iceweasel empleando el repositorio wheezy-backports. Con la versión estable, la 17, tampoco.
El problema fundamental es de situación de archivos, especialmente complementos, y nombres de los mismos. Sospecho que hay algo más pero he sido incapaz de averigüar el qué. Normalmente llego a esta conclusión cuando me veo examinando las llamadas al sistema generadas con un trazado de la ejecución del navegador (usando strace); es entonces cuando me digo que es mejor dejarlo y atacar el problema por otra parte.
A modo de resumen ésto es lo que he hecho para ser capaz de firmar en la AEAT desde Debian:
- Instalar Firefox
- Instalar el entorno Java de Oracle/Sun
- Instalar certificados digitales y realizar otros ajustes en la configuración.
No pretendo sustituir el navegador que se incluye de serie en el sistema. No me parece una buena idea porque funciona estupendamente con sitios especiales (como los bancos) y sólo presenta problemas cuando se trata de emplear applets Java para firmar envíos. Además, tampoco estoy seguro de si seguirá funcionando al cambiar la versión del navegador y, lo peor, me tocará a mí crear y mantener los paquetes de Firefox que precisen actualizaciones de seguridad. Casi que no, que bastante tengo.
Mi enfoque ha sido crear paquetes Debian específicos que instalen tanto el navegador como el java de Oracle bajo la jerarquía /opt y añadir algunos scripts de arranque y otras retoques para que puedan emplearse como programas independientes. He tenido más problemas con Java de lo que pensaba porque en Debian es un farragoso cortocircuitar el mecanismo de selección del entorno pero al final ha quedado bien.
Con Firefox he optado por otra opción, mitad aislamiento y mitad integración. Consiste en que el programa que lanza el navegador se asegura de que exista un perfil de ejecución llamado AEAT antes de lanzar el programa real y así es posible añadir configuraciones concretas (como la página de inicio o algunos ajustes en el tratamiento de applets) sin afectar a los perfiles que se usan normalmente con Iceweasel. Usa algún parámetro más para que no se reutilice ninguna sesión abierta y otro par de detalles que expondré más abajo.
Ya de paso el paquete que instala el navegador (empresa-firefox) lleva consigo los certificados raíz que se necesitan instalar como fiables en el navegador. Es una instalación global usando el paquete ca-certificates pero es la forma más directa de hacerlo.
Fragmentos
El archivo de preferencias que sitúo en el perfil AEAT tiene los siguientes valores:
// Disable default browser checking. pref("browser.shell.checkDefaultBrowser", false); // Setting starupt home page pref("browser.startup.homepage", "http://www.aeat.es"); pref("browser.startup.page", "1"); // Enable signed applets for @FIRMA client pref(("signed.applets.codebase_principal_support", true);
y el script que lanza Firefox con su entorno es:
#!/bin/bash # # Invoca al programa Firefox según el nombre con el que se llame: # - con un perfil específico para acceder al servicio de la AEAT # - con el perfile predeterminado (ojo, que puede colisionar con la # instalación actual de iceweasel) # # Variables VERSION="0.3" CONFIG_DIR=/etc/empresa CONFIG="${CONFIG_DIR}/firefox.conf" PROFILE_NAME=AEAT PROFILE_PATH=$(ls -1d ${HOME}/.mozilla/firefox/*.${PROFILE_NAME}) DEFAULT_URL="http://www.aeat.es" ROOT_DIR=/opt/firefox FIREFOX_ARGS="-no-remote -silent" GOTOAEAT=yes # Según el nombre case $(basename $0) in firefox-aeat) GOTOAEAT=yes ;; firefox-opt) GOTOAEAT=no ;; esac # Parámetros URL=$* # Cargamos archivo de configuración if [ -r $CONFIG ]; then . $CONFIG fi # Situamos el navegador FIREFOX="${ROOT_DIR}/$(dpkg --print-architecture)/firefox" if [ ! -x $FIREFOX ]; then FIREFOX=/usr/bin/firefox fi # Discriminados según vayamos o no a la AEAT case $GOTOAEAT in yes) # Verificamos si existe el perfil if [ ! -e $PROFILE_PATH ];then # Procedemos a crear el perfil ${FIREFOX} -CreateProfile ${PROFILE_NAME} -no-remote if [ $? -ne 0 ]; then echo "No puedo crear el perfil ${PROFILE_NAME}" >&2 exit 1 fi fi FIREFOX_ARGS="-P ${PROFILE_NAME} ${FIREFOX_ARGS}" # Comprobamos si las preferencias de usuario existen if [ ! -e "${PROFILE_PATH}/user.js" ]; then cp "${CONFIG_DIR}/firefox-user.js" "${PROFILE_PATH}/user.js" fi # Dirección que abrir if [ ! -z "$URL" ]; then OPEN_URL="-url ${URL}" else OPEN_URL="-url ${DEFAULT_URL}" fi ;; no) [ ! -z "$URL" ] && OPEN_URL="-url ${URL}" ;; esac # Lanzamos el navegador con el perfil indicado exec ${FIREFOX} ${FIREFOX_ARGS} ${OPEN_URL}
En este caso las referencias a la arquitectura del sistema (dpkg –print-architecture) se deben a que construyo dos paquetes distintos, uno para amd64 y otro para i386, y me obligo a situar cada uno bajo los directorios /opt/firefox/{amd64,i386}. Es sólo una forma de organizarse por si me hace falta tener las dos opciones con algunas páginas web.
Comentarios sobre los paquetes
En ambos casos la construcción de los paquetes parte del archivo empaquetado correspondiente. Uno descargado del repositorio de Mozilla y otro del repositorio de Oracle.
Para éste último recomiendo emplear el programa make-jpkg porque simplifica mucho la construcción del paquete y su instalación. No ha sido mi caso porque prefiero controlar más todo el proceso y aprender con ello pero sigo pensando que es muy buena opción. Sólo hay un detalle importante que make-jpkg obvia y es añadir el complemento Java para el navegador Firefox; como es lógico sólo tiene soporte para Iceweasel y Chromium. Se puede añadir con un script de configuración del paquete (debian/postinst) de la siguiente forma:
#!/bin/sh # postinst script for empresa-sun-java # # see: dh_installdeb(1) set -e # Variables export JAVA_HOME="/opt/java-oracle/$(dpkg --print-architecture)/$(cat /usr/share/empresa/java/version)/" # Funciones de configuración (tomadas de make-jpkg) install_alternatives() { program_base="$1" shift for program in $*; do update-alternatives --install "/usr/bin/${program}" "${program}" \ "${program_base}/${program}" 316 \ --slave "/usr/share/man/man1/${program}" "${program}.1.gz" \ "${program_base}/../man/man1/${program}.1" done } install_no_man_alternatives() { program_base="$1" shift for program in $*; do update-alternatives --install "/usr/bin/${program}" "${program}" \ "${program_base}/${program}" 316 done } install_browser_plugin() { local link_path="$1" local link_name="$2" local plugin_name="$3" local plugin="$4" [ -d "${link_path}" ] || install -d -m 755 "${link_path}" update-alternatives --install "${link_path}/${link_name}" \ "${plugin_name}" "${plugin}" 316 } set_java_environment() { if [ -e /opt/java-oracle/latest ]; then rm -f /opt/java-oracle/latest fi ln -s "${JAVA_HOME}" /opt/java-oracle/latest grep -q -s JAVA_HOME /etc/environment if [ $? -ne 0 ]; then echo 'JAVA_HOME=/opt/java-oracle/latest' >> /etc/environment fi } case "$1" in configure) # Instalamos ejecutables con página de manual install_alternatives "${JAVA_HOME}/bin" java javaws keytool orbd \ pack200 rmiregistry servertool tnameserv unpack200 \ policytool javaws # Instalamos ejecutables sin página de manual install_no_man_alternatives "${JAVA_HOME}/bin" ControlPanel install_no_man_alternatives "${JAVA_HOME}/lib" jexec # Instalamos el complemento para los navegadores plugin_dir="${JAVA_HOME}/lib/$(dpkg --print-architecture)" install_browser_plugin "/usr/lib/iceweasel/plugins" \ "libjavaplugin.so" "iceweasel-javaplugin.so" \ "${plugin_dir}/libnpjp2.so" install_browser_plugin "/usr/lib/chromium/plugins" \ "libjavaplugin.so" "chromium-javaplugin.so" \ "${plugin_dir}/libnpjp2.so" install_browser_plugin "/usr/lib/mozilla/plugins" \ "libjavaplugin.so" "mozilla-javaplugin.so" \ "${plugin_dir}/libnpjp2.so" # Preparamos entorno para java set_java_environment ;; abort-upgrade|abort-remove|abort-deconfigure) ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 1 ;; esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0
que además modifica el archivo /etc/environment para definir la variable JAVA_HOME al directorio donde hemos instalado el entorno JRE. Bueno, en realidad apunta a /opt/java-oracle/latest porque he pensado que es mejor si tenemos que actualizar la versión en el futuro (puedes apostar tu vida a que sí será necesario).
Los enlaces a las imágenes fallan si lees esta página desde un lector RSS (en concreto, con Feedly). Quizá es porque son relativos y no absolutos (no lo he comprobado).
¿ Desde el navegador ? Acabo de probarlo y funciona. Desde un cliente Android posiblemente no porque el URL de las imágenes también abre una conexión SSL y parece ser que es una carencia bastante común.
A el cliente Android de Tiny Tiny RSS le ocurre lo mismo, una gracia.