Cliente @firma de la AEAT y Debian …

debian-logo… 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).

Enlaces y referencias

2 thoughts on “<span>Cliente @firma de la AEAT y Debian …</span>”

  1. 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).

  2. ¿ 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.

Comments are closed.