DNIe: A vueltas con el DNI electrónico

Aunque ya se ha hablado del tema previamente , I wanted to give another lap to the issue DNIe under Linux. And what the hell! After spending one day and a half on the subject, I wanted to leave the tutorial available somewhere, if I have to do it again.

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

Check your base libraries

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 

Installing the dnie drivers

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

Not that easy

At this point, we learn that we have screwed up somewhere in the installation. Now OpenSC is waiting for a version of the module that is not what we have installed. Do not panic, there is a solution . We “only” have to create a module that uses the module installed. But deceiving OpenSC by saying it is another version.

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.