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 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.
Although this has already been discussed previously , 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.

When I started I was recommended that I tried on Windows first and then if it works, I should try again on Linux. And although I followed the advice, it turns out I am definitely worse in Windows than in Linux (I ended up having to reinstall Windows again), so I tried again where I felt comfortable and understood what I do.

Fundamentalmente me he guiado por tres entradas de blogs:
* DNIe en Ubuntu
* DNIe en Linux 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 libltdl3*.deb
# dpkg -i libopenct*.deb
# dpkg -i libopensc2*.deb
# dpkg -i opensc_*.deb
# apt-get install pinentry-qt4
# dpkg -i opensc-dnie*.deb

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,
[…]
DNI electronico (Spanish electronic ID card)
https://www.dnielectronico.es
delawen@FZ18E:~$ 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:
Nr. Driver Name
0 pcsc Gemplus GemPC Twin 00 00
delawen@FZ18E:~$ 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 reader with a card: 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:6a:44:4e:49:65:10:02:4c:34:01:13:03:90:00
delawen@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 reader with a card: 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";
char * sc_driver_version() {
return version_maligna;
}

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

$ gcc -fpic -g -c -Wall patch.c
$ objcopy --redefine-sym sc_driver_version=orig_sc_driver_version libopensc-dnie.so.1.0.4_orig libopensc-dnie.so.1.0.4
$ chmod +x libopensc-dnie.so.1.0.4
$ gcc -shared -Wl,-soname,libwrapper-dnie.so libopensc-dnie.so.1.0.4 patch.o -o libwrapper-dnie.so.1.0.0
$ sudo cp libwrapper-dnie.so.1.0.0 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; por module = /usr/lib/libwrapper-dnie.so;.

Ahora opensc ya reconoce nuestro DNI electrónico:

$ opensc-tool -l
Readers known about:
Nr. Driver Name
0 pcsc Gemplus GemPC Twin 00 00

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.
Basically I have been following this three blog posts:
* DNIe on Ubuntu
*
Linux DNIe Squeeze
*
DNIe on Ubuntu

The first thing I discovered is that one should not rely on the libraries from the repositories (I use Debian Squeeze). So I installed bare hands OpenSC and its dependencies.

First thing to do is to download the latest libraries available on the website of dnielectronico, in my case:

$ 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

And also download the dependencies that are no longer available for 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

When this is done, we can begin to install the dnie drivers:

# 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

And then we make sure not to screw it in future updates, blocking the libraries:

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

Now comes the nice part, where we see that everything works … or not:

$ 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

At this point, we learn that we have screwed up somewhere in the installation and 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.

My module version is 1.0.4 and opensc the 0.11.13-1.1, you must change this numbers with yours:

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

Edit a file:

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

Patching the library and place it where it belongs:


$ 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

Now that we have the library, we make opensc to use it in the file / etc / opensc / opensc.conf, replacing module = / usr / lib / libopensc-dnie.so, by < em> module = / usr / lib / libwrapper-dnie.so, .

Now opensc recognizes our electronic ID:

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

How to use the browser or an application to sign has already been extensively described in other manuals, including the official pages of the electronic ID.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.