DNIe: A vueltas con el DNI electrónico

Aunque ya se ha hablado del tema previamente , quería darle una vuelta más al tema del uso del DNI electrónico (DNIe) en Linux. Y, ¡qué diantres!, después de día y medio dandole vueltas al tema quería dejar el tutorial en algún sitio accesible, por si tengo que volver a hacerlo.

Cuando empecé con el tema lo que me recomendaron fue que primero lo intentara en Windows y luego que ya si eso, que me comiera la cabeza en Linux. Y aunque seguí el consejo, resulta que soy infinitamente más patosa en Windows que en Linux (acabé teniendo que reinstalarlo de cero), así que volví a intentarlo en donde me sentía cómoda y entendía lo que hago.
Fundamentalmente me he guiado por tres entradas de blogs:
* DNIe en Ubuntu
*
Linux DNIe Squeeze
*
DNIe en Ubuntu

Lo primero que descubrí es que no hay que confiar en las librerías de los repositorios (utilizo Debian Squeeze). Así que instalé a mano tanto las dependencias de OpenSC como las librerías que utiliza.

Lo primero es descargar las ultimas librerías disponibles en la página del dnielectronico, en mi caso:

$ wget https://www.dnielectronico.es/descargas/PKCS11_para_Sistemas_Unix/opensc-dnie_1.4.8_amd64_lenny.tar
$ tar xvf opensc-dnie_1.4.8_amd64_lenny.tar
$ cd opensc-dnie_1.4.8_amd64_lenny

Y descargamos también las dependencias que ya no están disponibles para Debian Squeeze:

$ wget https://ftp.es.debian.org/debian/pool/main/libt/libtool/libltdl3_1.5.26-4+lenny1_amd64.deb
$ wget https://ftp.es.debian.org/debian/pool/main/o/openct/libopenct1_0.6.14-3_amd64.deb

Hecho esto, podemos empezar a instalar:

# dpkg-i *. deb libltdl3
# dpkg-i *. deb libopenct
# dpkg-i *. deb libopensc2
# dpkg-i *. deb opensc_
# apt-get install pinentry-qt4
# dpkg-i *. deb opensc-dnie

Y a continuación nos aseguramos de no meter la pata en futuras actualizaciones, bloqueando las librerias:

# echo libopenct1 hold | dpkg - set-selections
# echo opensc hold | dpkg - set-selections
# echo libopensc2 hold | dpkg - set-selections

Ahora viene la parte bonita, en la que comprobamos que todo funciona...o no:

$ sudo apt-get install pcscd pcsc-tools
$ pcsc_scan
PC / SC device scanner
V 1.4.16 (c) 2001-2009, Ludovic Rousseau
Compiled with PC / SC lite version: 1.5.5
Scanning present readers ...
0: Gemplus GemPC Twin 00 00

Mon Sep 5 20:01:11 2011
Reader 0: Gemplus GemPC Twin 00 00
Card state: Card inserted,
[…]
Electronic DNI (Spanish electronic ID card)
https://www.dnielectronico.es
$ opensc-tool-l
[opensc-tool] ctx.c: 367: load_dynamic_driver: dynamic library ‘/ usr/lib64/libopensc-dnie.so’: invalid module version
[Opensc-tool] ctx.c: 467: load_card_drivers: Unable to load ‘dnie’.
Readers Known about:
Driver Name Nr
Pcsc 0 00 00 Gemplus Twin GemPC
$ opensc-tool-a
[opensc-tool] ctx.c: 367: load_dynamic_driver: dynamic library ‘/ usr/lib64/libopensc-dnie.so’: invalid module version
[Opensc-tool] ctx.c: 467: load_card_drivers: Unable to load ‘dnie’.
Using With A card reader: Gemplus GemPC Twin 00 00
[Opensc-tool] reader-pcsc.c: 239: pcsc_transmit: unable to transmit
[Opensc-tool] apdu.c: 394: do_single_transmit: unable to transmit APDU
3b: 7f: 38:00:00:00:6 a: 44:4 e: 49:65:10:02:4 c: 34:01:13:03:90:00
Delawar @ FZ18E: ~ $ opensc-tool-n
[opensc-tool] ctx.c: 367: load_dynamic_driver: dynamic library ‘/ usr/lib64/libopensc-dnie.so’: invalid module version
[Opensc-tool] ctx.c: 467: load_card_drivers: Unable to load ‘dnie’.
Using With A card reader: Gemplus GemPC Twin 00 00
[Opensc-tool] reader-pcsc.c: 239: pcsc_transmit: unable to transmit
[Opensc-tool] apdu.c: 394: do_single_transmit: unable to transmit APDU
Unidentified card

Llegados a este punto, es cuando nos enteramos de que hemos metido la pata en algún punto de la instalación, y OpenSC está esperando una versión del módulo que no es la que está instalada. Que no cunda el pánico, hay solución. "Sólo" tenemos que hacer un módulo que utilice el módulo instalado pero que engañe al OpenSC y le diga que es otra versión.

Mi versión del módulo es la 1.0.4 y la de opensc la 0.11.13-1.1, tenéis que cambiarla por la vuestra:

$ mkdir / tmp / dnie
$ cd / tmp / dnie
$ cp / usr/lib/libopensc-dnie.so.1.0.4 libopensc-dnie.so.1.0.4_orig

Editamos un fichero:

$ vi patch.c
char * version_maligna = "0.11.13-1.1";
sc_driver_version char * () {
version_maligna return;
}

Parcheamos la librería y lo colocamos donde le corresponde:


$ gcc-fpic -g-c-Wall patch.c
$ objcopy - redefine-sym-libopensc sc_driver_version = orig_sc_driver_version libopensc-dnie.so.1.0.4 dnie.so.1.0.4_orig
$ chmod + x libopensc-dnie.so.1.0.4
$ gcc-shared-Wl,-soname, libwrapper-dnie.so libopensc-dnie.so.1.0.4 patch.o-o-dnie.so.1.0.0 libwrapper
$ sudo cp-dnie.so.1.0.0 libwrapper libopensc-dnie.so.1.0.4 / usr / lib
$ sudo ldconfig

Ahora que tenemos la librería, avisamos a opensc de que la use en el fichero /etc/opensc/opensc.conf, sustituyendo la línea module = / usr / lib / libopensc-dnie.so, by < em> module = / usr / lib / libwrapper-dnie.so, .

Ahora opensc ya reconoce nuestro DNI electrónico:

$ opensc-tool -l
Known Readers about:
Driver Name Nr
Pcsc 0 00 00 Gemplus Twin GemPC

El cómo utilizarlo específicamente en el navegador o en una aplicación para firmar, eso ya viene ampliamente descrito en otros manuales, incluidas las páginas oficiales del DNI electrónico.