Lector de DNI electrónico en Linux: rápido y sencillo en Firefox

Configurar un lector de DNI electrónico en Linux, para emplearlo con Firefox,  nunca fue tan sencillo. Es cierto que siempre ha sido bastante complejo, o al menos, a mí me lo parecía. Pero en mi experiencia de haber configurado lectores de DNIe en los últimos años, ahora es pan comido. Y os voy a desvelar cómo hacerlo paso a paso.

Aunque es obvio que para poder emplearlo, primero tenéis que adquirir un lector de DNIe español. Yo empleo uno de la marca Woxter, que apenas cuesta 12 €. Es realmente barato teniendo en cuenta el ahorro de dinero que realizamos sin tener que desplazarnos físicamente a todos los edificios de la administración. Merece la pena, y mucho.

En esta entrada os voy a explicar cómo configurar y emplear correctamente un lector de DNIe desde cero. Con apenas 3 pasos podremos disfrutar de toda la administración española sin movernos de nuestro asiento. El proceso en total lleva apenas 10 minutos. Y sin renunciar a nuestro Linux ni a nuestro zorrito de Firefox. ¿Os animáis?

Lector de DNI electrónico en Linux: rápido y sencillo en Firefox

Quiero leer...

Descarga del libpkcs11

El paquete libpkcs11 es imprescindible para poder emplear el lector de DNI electrónico en Linux. Este paquete no está en los repositorios, sino que la descarga del paquete libpkcs11 para Linux se hace desde los mismos servidores del Cuerpo Nacional de Policía de España, alojados en esta web. En mi caso, como empleo Linux Mint, me descargué el paquete Ubuntu_libpkcs11-dnie_1.5.0_amd64.deb. Una vez ya descargado, lo instalé rápidamente en mi ordenador haciendo doble clic.

Lector de DNI electrónico en Linux: operativo en Firefox sin problemas

Para la instalación de este paquete es necesario que se instalen otros cuatro paquetes básicos:

  • pcsc-tools
  • pcscd
  • pinentry-gtk2
  • libccid

Los podemos instalar ejecutando el siguiente código en nuestro terminal de Linux, si no se han instalado automáticamente al instalar libpkcs11.

sudo apt install pcsc-tools pcscd pinentry-gtk2 libccid

Comprobamos el lector de DNI electrónico en Linux

Una vez instalado el paquete libpkcs11, lo primero que hacemos es conectar el lector de DNI electrónico a nuestro ordenador mediante un USB.

Revisamos qué está conectado con lsusb

Pues eso mismo. Vamos a comprobar qué dispositivos están conectados en nuestro ordenador para ver si aparece nuestro lector de DNI electrónico en Linux. Para ello, ejecutamos lsusb en nuestro terminal Linux:

mario@mario-R530-R730-P530:~$ lsusb
Bus 002 Device 004: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. 
Bus 002 Device 003: ID 1ea7:0064 
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 1210:25f4 DigiTech 
Bus 001 Device 004: ID 058f:9540 Alcor Micro Corp. AU9540 Smartcard Reader
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Nos fijamos que nuestro lector de DNI electrónico en Linux se ha reconocido perfectamente porque aparece Alcor Micro Corp. AU9540 Smartcard Reader en la lista.

Comprobamos que el lector de DNIe funciona correctamente

Sin nuestro DNIe introducido en el lector, vamos a ejecutar en nuestra terminal Linux pcsc_scan:

mario@mario-R530-R730-P530:~$ pcsc_scan
PC/SC device scanner
V 1.5.2 (c) 2001-2017, Ludovic Rousseau <ludovic.rousseau@free.fr>
Using reader plug'n play mechanism
Scanning present readers...
0: Alcor Micro AU9560 00 00

Sun May 26 10:27:14 2019
Reader 0: Alcor Micro AU9560 00 00
Card state: Card removed, 
|

La ejecución de pcsc_scan deja la terminal activa a la espera de introducir el DNIe. En nuestro caso identifica perfectamente el dispositivo y además indica que no tiene ningún DNIe introducido, ya que aparece Card removed.

A continuación, vamos a introducir nuestro DNIe en el lector y vemos que nuestra terminal cambia automáticamente con los datos de nuestro DNIe, e indicando Card inserted.

Sun May 26 10:30:21 2019
Reader 0: Alcor Micro AU9560 00 00
Card state: Card inserted, 
ATR: ####################

ATR: ####################
+ TS = 3B --> Direct Convention
+ T0 = 7F, Y(1): 0111, K: 15 (historical bytes)
TA(1) = 96 --> Fi=512, Di=32, 16 cycles/ETU
250000 bits/s at 4 MHz, fMax for Fi = 5 MHz => 312500 bits/s
TB(1) = 00 --> VPP is not electrically connected
TC(1) = 00 --> Extra guard time: 0
+ Historical bytes: #########################
Category indicator byte: 00 (compact TLV data object)
Tag: 6, len: A (pre-issuing data)
Data: ##########################
Mandatory status indicator (3 last bytes)
LCS (life card cycle): 03 (Initialisation state)
SW: 9000 (Normal processing.)

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
#######
#######
DNIE Spain (eID)
http://www.dnielectronico.es/PortalDNIe/
|

Si vemos algo parecido a lo que se ve arriba, es indicativo de que nuestro lector funciona correctamente, ya que permite identificar y leer nuestro DNIe. Asimismo, indicaros que las almohadillas anteriores equivalen a una numeración específica de mi DNI, por lo que lo he omitido.

Configurar Firefox para reconocer el lector de DNI electrónico en Linux

Una vez que hemos visto que el lector de DNI electrónico en Linux está perfectamente instalado y operativo en nuestro sistema operativo, tenemos que configurar Firefox para que podamos hacer uso de él. Entre otras cosas, podremos hacer cientos de papeles de la administración sin movernos de nuestra silla y a cualquier hora.

Ajustes de Firefox

Vamos a las Ajustes de Firefox, buscamos la pestaña Privacidad & Seguridad, y ahí Dispositivos de seguridad.

Dispositivos de seguridad

Ese botón nos lleva a una nueva ventana donde tendremos que cargar el dispositivo. Para ello presionamos sobre Cargar, a la derecha.

lector de dni electrónico en linux

En la ventana que nos aparece tendremos que indicar el Nombre del módulo que queremos dar a nuestro dispositivo. Podemos poner cualquiera, pero eso sí, que nos sea fácil de recordar qué es lo que hace ese dispositivo. En nuestro caso lo vamos a llamar DNI-e.

Por su parte, en Nombre del archivo del módulo tenemos que indicar la ruta de acceso al archivo libpkcs11-dnietif.so. En mi caso se sitúa en /usr/lib.

lector de dni electrónico en linux

Otro archivo que puede meterse en Nombre del archivo del módulo es /usr/lib/libpkcs11-dnie.so. En este último caso me ha funcionado en octubre de 2021.

De este modo, ya tendríamos preparado el dispositivo del DNIe en Firefox. Lo comprobamos pinchando sobre el lector que aparece debajo del nombre que hemos puesto DNI-e.

Uso del lector de DNI electrónico en Linux

Para poder usar nuestro DNI electrónico en Linux, una vez está todo instalado y configurado, es muy sencillo. Para ello, tenemos que ir a nuestro dispositivo que se ve en la última imagen y pinchar en Iniciar sesión, a la derecha. Ahí ponemos la contraseña que tengamos de la Policía y listo, ya podremos hacer papeleos y burocracias desde la comodidad de nuestro asiento.

Como complementación a esta última forma de proceder, os indico que otra forma es ir directamente a la web de la administración española que necesitemos y acceder a través de DNIe / Certificado electrónico. De este modo, siempre y cuando tengáis el DNIe introducido en el lector, os saldrá una ventana para que escribáis la contraseña. Y ya estaréis virtualmente dentro de la administración.

4 comentarios en «Lector de DNI electrónico en Linux: rápido y sencillo en Firefox»

  1. Hola! He seguido los pasos que comentas pero al lanzar el pcsc_scan tengo este error:

    PC/SC device scanner
    V 1.5.2 (c) 2001-2017, Ludovic Rousseau ludovic.rousseau@free.fr
    SCardEstablishContext: Service not available.

    la traza es

    strace pcsc_scan
    execve(«/usr/bin/pcsc_scan», [«pcsc_scan»], 0x7ffcba185460 /* 58 vars /) = 0
    brk(NULL) = 0x5555f8e44000
    access(«/etc/ld.so.nohwcap», F_OK) = -1 ENOENT (No such file or directory)
    access(«/etc/ld.so.preload», R_OK) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, «/etc/ld.so.cache», O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=123138, …}) = 0
    mmap(NULL, 123138, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7101a7d000
    close(3) = 0
    access(«/etc/ld.so.nohwcap», F_OK) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, «/usr/local/lib/libpcsclite.so.1», O_RDONLY|O_CLOEXEC) = 3
    read(3, «\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\27\0\0\0\0\0\0″…, 832) = 832
    fstat(3, {st_mode=S_IFREG|0755, st_size=181384, …}) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7101a7b000
    mmap(NULL, 2141904, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f710166a000
    mprotect(0x7f7101674000, 2093056, PROT_NONE) = 0
    mmap(0x7f7101873000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x9000) = 0x7f7101873000
    close(3) = 0
    access(«/etc/ld.so.nohwcap», F_OK) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, «/lib/x86_64-linux-gnu/libpthread.so.0», O_RDONLY|O_CLOEXEC) = 3
    read(3, «\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000b\0\0\0\0\0\0″…, 832) = 832
    fstat(3, {st_mode=S_IFREG|0755, st_size=144976, …}) = 0
    mmap(NULL, 2221184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f710144b000
    mprotect(0x7f7101465000, 2093056, PROT_NONE) = 0
    mmap(0x7f7101664000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19000) = 0x7f7101664000
    mmap(0x7f7101666000, 13440, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f7101666000
    close(3) = 0
    access(«/etc/ld.so.nohwcap», F_OK) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, «/lib/x86_64-linux-gnu/libc.so.6», O_RDONLY|O_CLOEXEC) = 3
    read(3, «\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0″…, 832) = 832
    fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, …}) = 0
    mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f710105a000
    mprotect(0x7f7101241000, 2097152, PROT_NONE) = 0
    mmap(0x7f7101441000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f7101441000
    mmap(0x7f7101447000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f7101447000
    close(3) = 0
    mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7101a78000
    arch_prctl(ARCH_SET_FS, 0x7f7101a78740) = 0
    mprotect(0x7f7101441000, 16384, PROT_READ) = 0
    mprotect(0x7f7101664000, 4096, PROT_READ) = 0
    mprotect(0x7f7101873000, 4096, PROT_READ) = 0
    mprotect(0x5555f79fa000, 4096, PROT_READ) = 0
    mprotect(0x7f7101a9c000, 4096, PROT_READ) = 0
    munmap(0x7f7101a7d000, 123138) = 0
    set_tid_address(0x7f7101a78a10) = 3135
    set_robust_list(0x7f7101a78a20, 24) = 0
    rt_sigaction(SIGRTMIN, {sa_handler=0x7f7101450cb0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f710145d8a0}, NULL, 8) = 0
    rt_sigaction(SIGRT_1, {sa_handler=0x7f7101450d50, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7f710145d8a0}, NULL, 8) = 0
    rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
    prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192
    1024, rlim_max=RLIM64_INFINITY}) = 0
    fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), …}) = 0
    brk(NULL) = 0x5555f8e44000
    brk(0x5555f8e65000) = 0x5555f8e65000
    write(1, «PC/SC device scanner\n», 21PC/SC device scanner
    ) = 21
    write(1, «V 1.5.2 (c) 2001-2017, Ludovic R»…, 67V 1.5.2 (c) 2001-2017, Ludovic Rousseau ludovic.rousseau@free.fr
    ) = 67
    stat(«/var/run/pcscd/pcscd.comm», {st_mode=S_IFSOCK|0666, st_size=0, …}) = 0
    socket(AF_UNIX, SOCK_STREAM, 0) = 3
    connect(3, {sa_family=AF_UNIX, sun_path=»/var/run/pcscd/pcscd.comm»}, 28) = 0
    fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
    fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
    select(4, NULL, [3], NULL, NULL) = 1 (out [3])
    sendto(3, «\f\0\0\0\21\0\0\0», 8, MSG_NOSIGNAL, NULL, 0) = 8
    select(4, NULL, [3], NULL, NULL) = 1 (out [3])
    sendto(3, «\4\0\0\0\2\0\0\0\0\0\0\0», 12, MSG_NOSIGNAL, NULL, 0) = 12
    select(4, [3], NULL, NULL, NULL) = 1 (in [3])
    read(3, «\4\0\0\0\3\0\0\0\35\0\20\200», 12) = 12
    ioctl(2, TCGETS, {B38400 opost isig icanon echo …}) = 0
    write(1, «\33[31mSCardEstablishContext: Serv»…, 55SCardEstablishContext: Service not available.
    ) = 55
    exit_group(-1) = ?

    Sin embargo al ejecutar lsusb si que detecta el Smart Card Reader.

    No termino de ver como solucionarlo.

    ¿Como puedo hacerlo?

    Gracias,

    Atentamente,

    Xavier

    Responder
  2. hace años que funciono con el DNIe. Tuve la version de Ubuntu 18.04 hasta el mes pasado, la actualizé a la 20.04 y tambien tuve que renovar los certificados que me habian caducado y en ese momento me cambiaron al DNIe 3.0 y cuando llego a casa si bien me identifica los certificados, no me permite entrar en el administrador de dispositivos. No sé a que puede ser debido, anteriormento en la version 18.04 si permitía trabajar con DNIe 3.0. He buscado en la red y no encuentro nada al respeto, agradecería alguna sugerencia

    Responder
  3. Buenos días. Ante todo agradecerte el claro, correcto y trabajado manual que has llevado a cabo.
    Mi pregunta es: ¿Cómo se puede hacer para otras tarjetas diferentes al DNI-electrónico?
    Gracias por adelantado.
    Un cordial saludo.
    Luis Martín

    Responder

Deja un comentario