Cómo instalar Firma Digital de Costa Rica en GNU/Linux Ubuntu 18.04 y Debian 9

Esta guía documenta cómo instalar el controlador de la tarjeta de Firma Digital de Costa Rica y la jerarquía de certificados del Banco Central (SINPE) y del MICITT en los sistemas operativos Ubuntu 18.04 LTS y Debian 9.

Esta guía de instalación tiene los siguientes propósitos:

  • Configurar de la forma más sencilla y adecuada el sistema para que funcione con la mayor cantidad de programas.
  • Lograr que funcione para todos los usuarios del sistema, incluyendo los nuevos usuarios creados tras las instalación.
  • Aislar la librería de Firma Digital en una “caja de arena” (sandbox) para que funcione con múltiples usuarios del sistema simultáneamente (soluciona un defecto en la librería al crear ficheros temporales). Esta característica no está disponible en Debian 9.

Instalación de las dependencias

  • Instalar el soporte CCID de PC/SC para que reconozca el lector de tarjetas e IcedTea-Web para poder cargar algunos lanzadores que usan Java Web Start (los navegadores ya no soportan applets Java, ya no es posible usar el firmador de la CCSS) y OpenJFX si pretende usarse algún firmador que lo use (NexU, por ejemplo). Bubblewrap es la herramienta para aislar la librería en la caja de arena. Binutils y sudo no vienen instalados en Debian por defecto.
sudo apt -y install pcscd bubblewrap icedtea-netx openjfx binutils sudo

En el caso de Debian, para poder usar los comandos con sudo, ejecutar como root usermod -a -G sudo nombredeusuario reemplazando nombredeusuario por el nombre de usuario que se desee usar con sudo y reiniciar para aplicar cambios. En Ubuntu no es necesario este paso.

Descarga del “instalador”

  • Descargar el “instalador” en el desplegable llamado “Usuarios Linux” en la página de descarga de instaladores del sitio web de Soporte Firma Digital de Costa Rica, introduciendo el número de serie de la tarjeta y aceptando las condiciones.
  • Descomprimir el archivo zip descargado con unzip, en el momento de escribir esta documentación se llama sfd_ClientesLinux_Rev09.zip. Se creará una carpeta llamada Firma Digital. Se asume que el archivo zip se ha descargado en la carpeta Descargas:
cd ~/Descargas/

unzip sfd_ClientesLinux_Rev09.zip

Instalación de los certificados

Es necesario agregar a la lista de confianza la jerarquía de certificados del SINPE y del MICITT. En teoría solamente sería necesario instalar los certificados raíz del MICITT pero en la práctica hay algunas aplicaciones que necesitan los certificados intermedios del SINPE para completar la cadena a la hora de validar. El último instalador también incluye una CA del BCCR, probablemente para el certificado de código de su propio firmador (que en teoría tampoco debería ser necesario si el sistema operativo está correctamente actualizado). Para ello, un conjunto de comandos:

  • Copiar los certificados:
sudo cp ~/Descargas/Firma\ Digital/Certificados/* /usr/local/share/ca-certificates/

sudo rename.ul -- .cer .crt /usr/local/share/ca-certificates/*.cer

for file in /usr/local/share/ca-certificates/*.crt; do sudo openssl x509 -inform DER -in "$file" -out "$file.tmp"; done 2>/dev/null

sudo find /usr/local/share/ca-certificates/ -type f -empty -delete

sudo rename.ul -- .tmp '' /usr/local/share/ca-certificates/*.tmp
  • Regenerar los archivos de certificados para todas las aplicaciones:
sudo update-ca-certificates --fresh

Instalación del módulo PKCS#11

Aunque hay un módulo en el directorio Librerías, no es la versión más reciente y tiene varios defectos de enlazado. La versión distribuida en el paquete PinTool es más reciente y funciona correctamente en todos los programas probados. En el siguiente proceso se extrae y se instala conservando la fecha original de la librería.

  • Instalar el módulo PKCS#11 privativo en /usr/lib/x86_64-linux-gnu/:
cd ~/Descargas/Firma\ Digital/PinTool/IDProtect\ PINTool\ 6.41.01/DEB/

ar p idprotectclient_641.01-0_amd64.deb data.tar.gz | tar zx ./usr/lib/x64-athena/libASEP11.so

sudo cp -p usr/lib/x64-athena/libASEP11.so /usr/lib/x86_64-linux-gnu/
  • Crear los siguientes enlaces simbólicos (necesarios para que funcionen algunos programas):
sudo ln -s /usr/lib/x86_64-linux-gnu/libASEP11.so /usr/lib/

sudo mkdir -p /usr/lib/x64-athena/

sudo ln -s /usr/lib/x86_64-linux-gnu/libASEP11.so /usr/lib/x64-athena/
  • Crear el fichero /etc/Athena/IDPClientDB.xml y abrirlo para edición:
sudo mkdir /etc/Athena/

sudo gedit /etc/Athena/IDPClientDB.xml
  • En la ventana del editor de textos gedit, pegar el siguiente texto, guardar y cerrar el editor:
<?xml version="1.0" encoding="utf-8" ?>
<IDProtect>
 <TokenLibs>
  <IDProtect>
   <Cards>
    <IDProtectXF>
     <ATR type='hexBinary'>3BDC00FF8091FE1FC38073C821106600000000000000</ATR>
     <ATRMask type='hexBinary'>FFFF00FFF0FFFFFFFFFFFFFFFFF0FF00000000000000</ATRMask>
    </IDProtectXF>
   </Cards>
  </IDProtect>
 </TokenLibs>
</IDProtect>
  • Crear un fichero llamado /usr/share/p11-kit/modules/firma-digital.module y abrirlo para edición:
sudo gedit /usr/share/p11-kit/modules/firma-digital.module
  • En la ventana del editor de textos gedit, pegar el siguiente texto, guardar y cerrar el editor:
remote: |bwrap --unshare-all --dir /tmp --ro-bind /etc/Athena /etc/Athena --proc /proc --dev /dev --ro-bind /usr /usr --ro-bind /lib /lib --ro-bind /lib64 /lib64 --ro-bind /var/run/pcscd /var/run/pcscd p11-kit remote /usr/lib/x86_64-linux-gnu/libASEP11.so

En el caso de Debian 9 la línea anterior no funciona porque incluye una versión demasiado antigua de p11-kit. En su lugar debe usarse esta otra línea: module: /usr/lib/x86_64-linux-gnu/libASEP11.so.

  • Crear un fichero llamado /usr/local/sbin/update-p11-kit-symlinks y abrirlo para edición:
sudo gedit /usr/local/sbin/update-p11-kit-symlinks
  • En la ventana del editor de textos gedit, pegar el siguiente texto, guardar y cerrar el editor:
#!/bin/sh

FIREFOX_LIB=/usr/lib/firefox/libnssckbi.so
FIREFOX_ESR_LIB=/usr/lib/firefox-esr/libnssckbi.so
THUNDERBIRD_LIB=/usr/lib/thunderbird/libnssckbi.so
NSS_LIB=/usr/lib/x86_64-linux-gnu/nss/libnssckbi.so

if [ -e "$FIREFOX_LIB" ]
then
    if ! [ -L "$FIREFOX_LIB" ]
    then
        echo "Firefox libnssckbi.so is not a symlink. Fixing..."
        mv -f "$FIREFOX_LIB" "$FIREFOX_LIB".bak
        ln -s /usr/lib/x86_64-linux-gnu/p11-kit-proxy.so "$FIREFOX_LIB"
    fi
fi

if [ -e "$FIREFOX_ESR_LIB" ]
then
    if ! [ -L "$FIREFOX_ESR_LIB" ]
    then
        echo "Firefox ESR libnssckbi.so is not a symlink. Fixing..."
        mv -f "$FIREFOX_ESR_LIB" "$FIREFOX_ESR_LIB".bak
        ln -s /usr/lib/x86_64-linux-gnu/p11-kit-proxy.so "$FIREFOX_ESR_LIB"
    fi
fi

if [ -e "$THUNDERBIRD_LIB" ]
then
    if ! [ -L "$THUNDERBIRD_LIB" ]
    then
        echo "Thunderbird libnssckbi.so is not a symlink. Fixing..."
        mv -f "$THUNDERBIRD_LIB" "$THUNDERBIRD_LIB".bak
        ln -s /usr/lib/x86_64-linux-gnu/p11-kit-proxy.so "$THUNDERBIRD_LIB"
    fi
fi

if [ -e "$NSS_LIB" ]
then
    if ! [ -L "$NSS_LIB" ]
    then
        echo "NSS libnssckbi.so is not a symlink. Fixing..."
        mv -f "$NSS_LIB" "$NSS_LIB".bak
        ln -s /usr/lib/x86_64-linux-gnu/p11-kit-proxy.so "$NSS_LIB"
    fi
fi
  • Agregar el atributo de ejecutable al script:
sudo chmod +x /usr/local/sbin/update-p11-kit-symlinks
  • Crear un fichero llamado /etc/systemd/system/p11-kit-proxy-updater.service y abrirlo para edición:
sudo gedit /etc/systemd/system/p11-kit-proxy-updater.service 
  • En la ventana del editor de textos gedit, pegar el siguiente texto, guardar y cerrar el editor:
[Unit]
Description=mantenimiento de enlaces a p11-kit-proxy

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/update-p11-kit-symlinks

[Install]
WantedBy=multi-user.target
  • Activar el servicio al arranque y ejecutarlo una primera vez para comprobar que funciona:
sudo systemctl enable --now p11-kit-proxy-updater.service

Eso es todo. Es necesario reiniciar Firefox y cualquier otra aplicación que use certificados para que se apliquen los cambios. Si se ha insertado el lector y la tarjeta al lector, estas aplicaciones preguntarán por el PIN en páginas donde se solicite autenticación (por ejemplo en el sitio web de Internet Banking del Banco Nacional), lo que indicará que se la instalación ha sido exitosa.

Si el componente de firma del Banco Central está instalado debería funcionar para poder realizar la prueba de firma. El sitio web de Soporte Firma Digital podría usar todavía la prueba de Java y no funciona con los navegadores modernos. En su lugar podría usarse la prueba con el firmador BCCR desde la página de Firma Digital de verificación de certificados (requiere instalar los certificados para poder entrar).

Quizás resulte interesante utilizar la herramienta Firmador, software libre para firmar documentos.

7 comentarios
  1. Allan
    Allan
    22 de septiembre de 2016 a las 4:35 pm

    Gracias, el método descrito en la página de soporte no sirve, sin embargo este sí

    Responder
  2. Eddy Murias
    Eddy Murias
    4 de marzo de 2017 a las 9:17 pm

    lo felicito, excelente artículo y funciona a la perfección.
    saludos.

    Responder
  3. David Hine
    David Hine
    5 de abril de 2017 a las 3:02 pm

    Me funcionó a la perfección

    muchas gracias muy útil

    Responder
  4. Wilfredo Sanchez GV11819
    Wilfredo Sanchez GV11819
    15 de septiembre de 2018 a las 11:16 pm

    Es necesario seguir la guia de instalacion de http://www.soportefirmadigital.go.cr en sistemas linux, en mi caso Ubuntu 18.04? O solamente con esta guia?

    Qué version de Firefox es soportado?

    Gracias

    Responder
  5. Francisco de la Peña
    Francisco de la Peña (autor del artículo)
    15 de septiembre de 2018 a las 11:32 pm

    Hola Wilfredo, la guía mostrada en este blog no requiere más que descargar los controladores del sitio de Soporte Firma Digital, la guía que tienen allí hace tiempo que no la reviso, es más, creo que para visualizarla todavía require Flash y efectivamente no es necesario seguirla y ni la recomendaría. Lo más probable es que esa guía oficial siga agregando manualmente y para cada usuario del sistema el módulo PKCS#11 (libASEP11.so), mientras que la que propongo funciona para todos los usuarios y todos los navegadores.

    En cuanto al soporte de Firefox la funcionalidad que agrega serviría en todas las versiones de Firefox (excepto los applets, lo explico en el siguiente párrafo). La configuración mostrada aquí funciona para la autenticación con certificados de la tarjeta, por ejemplo para iniciar sesión en el sitio web de Banco Nacional (si se registra previamente, requiere Internet Explorer 11), entre otros. La configuración de Firefox en teoría debería funcionar con la que venga con Ubuntu 18.04. Lo que se muestra para configurar Firefox y Thunderbird es porque estos software utilizan su propia infraestructura de servicios criptográficos llamada Network Security System (NSS), que son junto con OpenSSL, GnuTLS y Java, software que permite acceder a tarjeta y que mantienen una lista de certificados que implementan cada uno a su manera de forma histórica. En distribuciones como Fedora se han esforzado para unificar toda la configuración. En Ubuntu todavía se ocupa realizar esos ajustes para poder tener una integración de acceso a dispositivo y a certificados que sirva para todos los usuarios.

    Cabe decir que los applets Java ya no tienen soporte desde hace más de un año en Firefox y la versión 52 ESR ya ha dejado de tener soporte, que era la última que soportaba applets. Lamentablemente, sitios web como el de la CCSS están utilizando esa tecnología obsoleta y la única manera sería descargar manualmente una versión vieja e insegura de Firefox, además de instalar el paquete icedtea web. La forma correcta de resolver este problema es que la Caja y otras instituciones actualicen sus mecanismos de firma digital lo antes posible, aunque sea usando el firmador del BCCR o con otras implementaciones alternativas. Saludos.

    Responder
    • Wilfredo
      Wilfredo
      15 de septiembre de 2018 a las 11:47 pm

      Gracias por su respuesta! Y Cómo valido que el sistema operativo esté detectado mi Athena smartcard?

      Responder
      • Francisco de la Peña
        Francisco de la Peña (autor del artículo)
        16 de septiembre de 2018 a las 12:00 am

        Con gusto. Se puede detectar en varios niveles. Se puede comprobar si la tarjeta funciona con la herramienta pcsc_scan que viene en el paquete pcsc-tools. Si se ejecuta por terminal detectará la tarjeta cuando se conecta. Para usar esta herramienta no necesita ni siquiera el módulo PKCS#11, ya que la detección la realiza a un nivel más bajo, que solamente requiere tener el proceso pcscd en ejecución.

        Si la tarjeta la detectara bien en este punto, entonces lector y tarjeta funcionan. Si por alguna razón funcionaran en el punto anterior pero no en otros lugares, podría faltar el fichero XML que se explica en la guia y que configura la máscara ATR para que el módulo libASEP11.so la detecte correctamente. Para verificar que en Firefox la detecta y si se han seguido los pasos de la guía, una forma fácil es ir al sitio web https://www.bnonline.fi.cr/ y haciendo clic sobre el botón de Firma Digital. Si funciona aparecerá una ventana de petición del PIN de la tarjeta. Si se ingresa el pin correctamente, aparecerá otra ventana para seleccionar el certificado de autenticación.

        Otra forma de probarlo de forma idéntica es el primer paso de la prueba de firma de Soporte Firma Digital, porque el primer paso es el mecanismo autenticación, que no requiere Java. El segundo paso de la prueba es para el proceso de firma, este sí que requiere Java y no serviría porque los navegadores modernos ya no soportan tecnología applet:
        https://www.soportefirmadigital.com/sfdj/validate.aspx?lang=es
        En cualquier caso, el primer paso ya demostraría que la tarjeta está funcionando correctamente.

        Otra alternativa para probarlo es dirigiéndose a las Preferencias de Firefox -> Privacidad y Seguridad -> abajo del todo seleccionar Dispositivos de seguridad, allí debería aparecer el lector de la tarjeta bajo la sección p11-kit-proxy y hacer clic en Iniciar sesión. Si pide el PIN y lo ingresa, aparecerá sesión iniciada. Esto no es necesario hacerlo para usarla en los sitios web pero es una forma de comprobar que funciona desde Firefox sin entrar en sitios web específicos.

        Otra manera es mediante la prueba del firmador BCCR o con el programa Firmador, que se mencionan en el penúltimo y último párrafo. En el caso del programa Firmador, solicitará el PIN al elegir un documento PDF para firmar, de lo contrario mostrará mensajes de error más o menos específicos indicando dónde podría estar fallando.

        Para prevenir errores en las pruebas, conviene que el lector esté conectado antes de iniciar Firefox o aparecerá un error poco intuitivo al tratar de realizarlas. La tarjeta sí que puede conectarse tanto antes como después de haber iniciado el navegador.

        Cabe mencionar que solamente he verificado el funcionamiento correcto con los lectores ASEDrive y Omnikey, que además son los que provee el instalador oficial de Soporte Firma Digital en Windows. En el caso de otros lectores, la mayoría son compatibles con Linux si usan la interfaz estándar CCID, pero no sabría decir si algún modelo concreto requiere alguna instalación adicional de controladores. Saludos.

        Responder
Dejar un comentario

La dirección de correo electrónico no aparecerá publicada. Los campos con * son requeridos.