Nuestros colegas informáticos del Cuerpo Nacional de Policía llevan el tema del DNI Electrónico (DNIe) bastante mal.

Primero porque comenzaron robando código libre del proyecto openSC y usándolo durante dos años como quien no quiere la cosa. Luego porque cuando se vieron forzados a liberarlo lo hicieron de manera parcial y chapucera. Finalmente porque, aunque distribuyen paquetes precompilados para algunas distribuciones, no los mantienen y obligan a utilizar versiones antiguas del OpenSC (ya ni hablar de dar soporte).

Así que voy a poner aquí como conseguir que el dichoso DNIe funcione en OpenSuse 11.3. Pasos:

  1. Eliminar cualquier instalación de opensc, libopensc de nuestro sistema (que probablemente está en la versión 0.11.13).
  2. Descargar opensc-0.11.9 de aquí y hacer los pasos usuales para compilar por consola. Tiene que ser este y no otro. (Hay que tener las librerías, los paquetes -devel etc que sean necesarios o sino el configure se quejará):

    $> tar -xf opensc-0.11.9
    $> cd opensc-0.11.9
    $> ./configure --prefix=/usr --enable-pcsc
    $> make
    $> sudo make install

  3. Descargar el paquete ofrecido en www.dnie.es para openSuse 11.2. (a día de hoy 1.4.8) e instalarlo:

    $> yast2 --install opensc-dnie-1.4.8-1.i586_suse.rpm

    Cuidado: hay que forzar que no se instalen las dependencias de opensc poniéndolas en tabu, o forzar la instalación pese a dependencias si lo haces con "rpm -i".
  4. Seguidamente, como root, copiar el archivo de configuración a su buen lugar (no hacer caso al instalador que dice que lo ha copiado solito).

    $> cd /usr/etc
    $> cp /usr/share/opensc-dnie/opensc.conf.dnie opensc.conf
    $> cp opensc.conf /etc/opensc.conf


    Al ser una instalación manual de opensc se está usando el de /usr/etc (a saber por qué), pero no está de más tenerlo también en /etc, dónde se supone que sí se debería haber copiado sólo, pero mejor curarse en salud.
  5. Si no se ha hecho ya, se puede ejecutar el paso de "Registrar módule DNIe PKCS#11" para el Firefox desde el acceso directo del menú de "Oficina". Atención: la ruta que ellos mismos ponen para instalar la autoridad certificadora está mal. Mi consejo es instalar las que dan ellos en su web, y no la que viene (que se llama "ac_raiz_dnie.crt" en realidad). En la web están aquí.
  6. Probamos. Para saber que se ha instalado bien el driver y que opensc lo encuentra:

    $>opensc-tool -D

    Debe devolver el driver dnie.
  7. También podemos probar si ya se leen los datos del DNIe:

    Iniciando el demonio del lector de tarjetas con usuario root:

    $>pcscd

    Y con la utilidad pkcs11-tool:

    $>pkcs11-tool -Ol

    La salida debería ser un montón de líneas rojas quejándose de:

    [opensc-pkcs11] card_helper.c:83:card_helper_read_file: returning with: Security status not satisfied
    [opensc-pkcs11] card_sync.c:994:card_sync_card_to_virtual_fs_data_file_callback: returning with: Security status not satisfied

    Para luego pedirnos nuestra contraseña del DNIe y mostrar algunos datos.
  8. Finalmente, reiniciar Firefox y acceder a la página de comprobación de que las cosas funcionan con el DNIe.
Posibles errores:
  • Estoy dando por hecho que el ordenador detecta el lector bien ("opensc -l") y que se trabaja con el daemon "pcscd" lanzado (*).
  • (Error code: ssl_error_bad_cert_alert):
Esto significa que a) El lector no está leyendo nada por alguna razón (averigua cuál probando el paso 7) o b) No has instalado bien las autoridades certificadoras del CNP (revisa paso 5).
  • (Error code: sec_error_pkcs11_general_error)
Esto me ha pasado cuándo mi versión de opensc no era la 0.11.9. Tiene que ser esa.

Cosas que no me funcionan:

Tras mucho leer (entre otros sitios en Kriptopolis), me he dado cuenta de cosas que no funcionan para OpenSuse 11.3, aunque se dicen por ahí:
  • No funciona compilar el código liberado, al menos no a la primera ni a la segunda, así que no merece la pena perder el tiempo. Además hay que meter ciertas claves en no se dónde (no he seguido investigando).
  • No funciona modificar la librería opensc-dnie.so.1.0.3 con un editor hexadecimal y cambiar el string que pone 0.11.9 a la versión que queramos, al menos yo volvía al (Error code: sec_error_pkcs11_general_error). Hay bastantes diferencias entre la 0.11.9 y la 0.11.13 como para que la cosa funcione así de simple.
  • No funciona crear una librería wrapper para que funcione con opensc 0.11.12 o 0.11.13 como indican aquí, aunque es muy entretenido ver cómo hackearlo. Esto se supone que sirve para solucionar (y lo hace, pero no el pkcs11_general_error) el mensaje de:
    [pkcs15-tool] ctx.c:367:load_dynamic_driver: dynamic library '/usr/lib/libopensc-dnie.so.1.0.3': invalid module version
    
Espero que le sirva a alguien todo esto. Y bienvenid@s a la administración electrónica, esa que en este país también es chapucera, secretista y cerrada.

(*) Como anécdota, me compré un lector multitarjetas marca Tecnimax, que asegura en el envoltorio compatibilidad con Linux, que en realidad lleva un chip de Realtek, y que viene con un CD que contiene un fichero PDF "using_SCR80-5169_in_linux" ¡en chino! Poca cosa pude sacar, excepto que se necesita "pcsc-lite" y "pcsc-ccid" para que funcione el lector de . Por su parte se puede eliminar openCT perfectamente.