24 enero, 2006

Utilizar tarjeta criptográfica en GNU/Linux

En mi anterior post veíamos cómo Instalar driver Omnikey CardMan 2020 usb. En éste vamos a darle utilidad a éste lector de tarjetas.

Esta parte me costó más de conseguir, y no fue por ganas. Fue por el software privativo. Me explico. La tarjeta que expide la ACCV utiliza el estándar PKCS#11 (hasta ahí bien). Pero accede a ése estándar a través de un API propietario (Siemens CardOS API). Cuando adquieres el lector, éste viene con un cd donde se encuentra este API (intentad buscarlo por internet, es complicadísimo encontrar un enlace de descarga), aunque solamente está para Window$.

Por suerte, en mi trabajo tenemos (aunque yo no lo sabía) contacto con gente de Siemens, que están bastante dispuestos a ayudar. Pues bien, perfecto, Siemens tiene un driver de la tarjeta para Linux, pero con un pequeño problema. No se puede distribuir, salvo que tengas una licencia del CardOS API (en el cd que viene con la tarjeta tienes una licencia, ¡Yuju!).

Una vez conseguido el API para Linux la instalación es muy sencilla:

  • Se copia el archivo .tgz en la raiz del sistema (/)
  • Se descomprime el archivo: tar xvzf archivo.tgz
Y a funcionar...

Con esto ya podemos utilizar la tarjeta criptográfica en Linux. Los pasos para utilizar cualquier tarjeta criptográfica (soportada en Linux) serían prácticamente los mismos. Si tenéis suerte vuestra tarjeta puede estar soportada por el proyecto OpenSC (aunque parece que tiene problemas con su dominio...). Soporta muchos tipos de tarjetas y trata de ser un API estándar para acceder a tarjetas criptográficas.

Preparar las aplicaciones

Ahora detallaré los pasos a seguir para utilizar la tarjeta criptográfica con los programas que más utilizamos (en mi caso Firefox, Evolution).

En primer lugar vamos a hacer un pequeño hack (si es correcto llamarlo así). Estas aplicaciones que he comentado tienen un punto en común a la hora de utilizar los certificados de la tarjeta; utilizan la librería NSS (Network Security Services) de Mozilla. Esto es importante porque en un principio ni Evolution, ni OpenOffice.org tienen un mecanismo para cargar certificados desde un lector de tarjetas. Así vamos a realizar los pasos siguientes:

  • Creamos un directorio en nuestro home:
    # mkdir .certs-db
    
  • Copiamos en esa carpeta los siguientes archivos del directorio de Firefox: cert8.db, key3.db, secmod.db
    # cp .mozilla/firefox/.default/cert8.db .certs-db
    # cp .mozilla/firefox/.default/key3.db .certs-db
    # cp .mozilla/firefox/.default/secmod.db .certs-db
    
  • Creamos enlaces simbólicos en Firefox y en Evolution:
    # ln -sf /home//.certs-db/cert8.db /home//.evolution/cert8.db
    # ln -sf /home//.certs-db/key3.db /home//.evolution/key3.db
    # ln -sf /home//.certs-db/secmod.db /home//.evolution/secmod.db
    # ln -sf /home//.certs-db/cert8.db /home//.mozilla/firefox/.default/cert8.db
    # ln -sf /home//.certs-db/key3.db /home//.mozilla/firefox/.default/key3.db
    # ln -sf /home//.certs-db/cert8.db \ 
    /home//.mozilla/firefox/.default/secmod.db
    

Así, los certificados que añadamos a Firefox nos servirán para Evolution. Igual que con las tarjetas criptográficas. Los módulos de tarjetas que añadamos a Firefox los podremos utilizar en Evolution.

Instalar el módulo de la tarjeta en Mozilla Firefox

Para instalar el módulo de la tarjeta en Firefox seguiremos los siguientes pasos:

  • Arrancamos Firefox.
  • Elegimos: Editar->Preferencias
  • Seleccinamos: Avanzadas
  • Desplegamos: Certificados
  • Presionamos sobre Administrar dispositivos de seguridad...
  • Elegimos Cargar, le damos un nombre descriptivo (en mi caso Siemens CardOS API) y elegimos el módulo que queremos cargar. Si utilizásemos OpenSC, por ejemplo, elegiríamos /usr/lib/pkcs11/opensc-pkcs11.so.
  • Aceptamos y ya está. Si accedemos a Administrar certificados nos pedirá la clave de nuestra tarjeta.

Ahora, si ejecutamos Evolution y mostramos los certificados, igualmente, nos pedirá el pin de nuestra tarjeta y podremos utilizarla con éste programa.

17 enero, 2006

Instalar driver Omnikey CardMan 2020 usb

En primer lugar podemos preguntarnos para qué sirve un lector de tarjetas. Estos lectores sirven para leer una tarjeta de firma electrónica.

En mi caso se trata de la firma que expide la ACCV. Esta firma se puede conseguir de manera gratuita en cualquier punto de registro autorizado. Y se puede solicitar en soporte software o en dispositivo seguro. En soporte software se le entrega al usuario en formato de disquete y es gratuito. En dispositivo seguro se entrega en tarjeta criptográfica y cuesta dinero (podéis consultar precios en la misma página del ACCV).

Por razones que no vienen al caso yo soy operador autorizado, y puedo expedir estas firmas digitales. Para ello dispongo de la firma electrónica en soporte de tarjeta y con un lector usb. Si el formato fuese en disquete no habría problemas para hacerla funcionar en linux, pero en formato tarjeta es un poco más laborioso.

En este primer post voy a explicar qué requerimientos hay para hacer funcionar el lector y que se reconozca la tarjeta insertada. En posteriores envíos trataré el tema de utilizar estos certificados desde linux.

Requerimientos

  • Driver Omnikey CardMan 2020: Módulo del kernel para el lector de tarjetas Omnikey CardMan 2020. La última versión es la 2.4.0 y tiene bastante tiempo ya, así que no creo que la actualicen.
  • - PC/SC Smart Card Daemon: Es un middleware que actúa de interfaz entre la tarjeta y las aplicaciones de manejo de los certificados.

Instalación

En primer lugar vamos a instalar pcsc-lite. En mi caso, al trabajar en Debian, se hace con el siguiente comando, si utilizáis otra distribución buscad cómo se instalaría en ella:

# apt-get install pcscd pcsc-tools

Después descomprimimos el archivo descargado del driver del lector y entramos al directorio creado:

# tar xzvf cm2020_installer_v2_4_0_src.tar.gz
# cd cm2020_installer_v2_4_0

Para instalar el módulo hace falta que tengamos los headers de nuestro kernel instalados y ejecutar el script de instalación que trae:

# sh ./install

Installing OMNIKEY Cardman USB Smartcard reader...

Checking, if pcsc-lite (>=1.2.0.) is installed ... found version 1.2.9-beta7. in /usr/sbin/pcscd
./install: line 113: [: 9-beta7: integer expression expected
Version too old!
Installing pcsc-lite to /usr
Preparing build of pcsc-lite ... OK
Building pcsc-lite ...

En mi caso ahí se queda. No quiero que continúe, ya que intenta compilar la versión 1.2.0 y yo tengo instalada la versión 1.2.9-beta7. Y ése el problema, no reconoce 9-beta7 como un número entero (yo tampoco, pero bueno). Mi solución, ha sido la siguiente; como compara con la versión 1.2.0 cualquier cosa que sea 1.2.X cumplirá la condición, así que elimino las referencias posteriores a 1.2:

# vi install

Localizamos la línea 113:

if [ \( \( $pcscd_maj -eq $pcscd_refmaj \) -a \( $pcscd_min -eq $pcscd_refmin \) -a \( $pcscd_fine -ge $pcscd_reffine \) \) -o \( \( $pcscd_maj -eq $pcscd_refmaj \) -a \( $pcscd_min -gt $pcscd_refmin \) \) -o \( $pcscd_maj -gt $pcscd_refmaj \) ]; then

Y eliminamos las referencias a $pcscd_reffine (que vale 0), quedando como resultado:

if [ \( \( $pcscd_maj -eq $pcscd_refmaj \) -a \( $pcscd_min -eq $pcscd_refmin \) \) -o \( \( $pcscd_maj -eq $pcscd_refmaj \) -a \( $pcscd_min -gt $pcscd_refmin \) \) -o \( $pcscd_maj -gt $pcscd_refmaj \) ]; then

Volvemos a ejecutar el script de instalación:

# sh ./install

Installing OMNIKEY Cardman USB Smartcard reader...

Checking, if pcsc-lite (>=1.2.0.) is installed ... found version 1.2.9-beta7. in /usr/sbin/pcscd
OK!
The kernel module for 2.6.12-10-686 isn't prebuilt!
Try to compile it for you!
make -C /lib/modules/2.6.12-10-686/build SUBDIRS=/home/asanchez/Downloads/cm2020_installer_v2_4_0_src/src/cm2020 modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.12-10-686'
  CC [M]  /home/asanchez/Downloads/cm2020_installer_v2_4_0_src/src/cm2020/cardman.o
  Building modules, stage 2.
  MODPOST
  CC      /home/asanchez/Downloads/cm2020_installer_v2_4_0_src/src/cm2020/cardman.mod.o
  LD [M]  /home/asanchez/Downloads/cm2020_installer_v2_4_0_src/src/cm2020/cardman.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.12-10-686'
Copy cardman.ko to /lib/modules/2.6.12-10-686/kernel/drivers/usb/misc
Attempting to start the cm_usb kernel module

Installation finished

Con esto tenemos el módulo instalado, si no lo ha cargado podemos cargarlo nosotros mismos:

# modprobe cardman
# lsmod | grep cardman
cardman                39460  0
usbcore               118044  3 cardman,ohci_hcd

Si insertamos el lector de tarjetas comprobaremos que se carga el driver dinámicamente. Ahora solamente queda reiniciar pcscd y comprobar que coge correctamente el lector:

# /etc/init.d/pcscd restart
Stopping PCSC Lite resource manager: pcscd.
Starting PCSC Lite resource manager: pcscd.
# pcsc_scan
PC/SC device scanner
V 1.4.1 (c) 2001-2004, Ludovic Rousseau 
Compiled with PC/SC lite version: 1.2.9-beta7
Scanning present readers
0: Omnikey CardMan 2020 00 00

Tue Jan 17 17:50:32 2006
 Reader 0 (Omnikey CardMan 2020 00 00)
        Card state: Card removed,

Tue Jan 17 17:50:45 2006
 Reader 0 (Omnikey CardMan 2020 00 00)
        Card state: Card inserted,
        ATR: 3B F2 98 00 FF C1 10 31 FE 55 C8 04 12

ATR: 3B F2 98 00 FF C1 10 31 FE 55 C8 04 12
+ TS = 3B --> Direct Convention
+ T0 = F2, Y(1): 1111, K: 2 (historical bytes)
  TA(1) = 98 --> Fi=512, Di=12, 42.667 cycles/ETU
  TB(1) = 00 --> Programming Param P: 0 Volts, I: 0 milli-Amp\uffffres
  TC(1) = FF --> Extra guard time: 255
  TD(1) = C1 --> Y(i+1) = 1100, Protocol T = 1
-----
  TC(2) = 10 --> Work waiting time: 960 x 16 x (Fi/F)
  TD(2) = 31 --> Y(i+1) = 0011, Protocol T = 1
-----
  TA(3) = FE --> IFSC: 254
  TB(3) = 55 --> Block Waiting Integer: 5 - Character Waiting Integer: 5
+ Historical bytes: C8 04 12

Possibly identified card (using /usr/lib/pcsc/smartcard_list.txt):
3B F2 98 00 FF C1 10 31 FE 55 C8 04 12
        CardOS M4.01a (SLE66CX322P)

Con esto ya tenemos el lector de tarjetas instalado en Linux, próximamente veremos cómo utilizar la tarjeta (y para qué sirve, si no lo sabéis).

Un saludo.

09 enero, 2006

Devil's Pie 0.16 y s-expressions

Me he decidido a probar la nueva versión de Devil's Pie (a pesar de que estaba funcionando con la versión 0.11). La última versión (al escribir estas líneas) es la 0.16. Hasta ahora no había cambiado la versión porque a partir de la versión 0.13 se cambió el archivo de configuración xml por archivos de configuración con formato "s-expression" (luego comentaré ese formato para quien no lo conozca).

¿Por qué el cambio de formato xml (cada vez más utilizado) a s-expressions? Para entender ese cambio habría que conocer un poco el formato s-expression (como yo no lo conocía eché un vistazo a la Wikipedia):

Básicamente, las s-expressions sirven para representar estructuras de datos en forma de texto. Se utilizan en los lenguajes de programación Lisp y Scheme principalmente.

Así, viendo las novedades de la versión 0.13 de Devil's Pie parece ser que se realizó el cambio porque con las s-expressions se pueden combinar diferentes "matchers" (¿alguna traducción candidata?) con operadores lógicos (or, and, not) de forma sencilla, multiplicando las posibilidades de configuración.

Hay una buena documentación en este wiki de Devil's Pie. Está bastante bien explicado y no se necesitan grandes conocimientos de inglés para seguir los ejemplos.

Después de probar la nueva forma de configuración solamente puedo decir que me gusta más. Ahora, en vez de tener un único archivo .devilspie.xml tenemos varios archivos .devislpie/archivo[s].ds. Y una vez escitos nuestros archivos y comprendiendo cómo funcionan, su lectura es muy rápida. Mi .devilspie/terminal-desktop.ds:

(if
        (is (window_name) "terminal-desktop")
        (begin
                (pin)
                (geometry "750x700+5+25")
                (skip_pager)
                (skip_tasklist)
                (wintype "desktop")
        )
)

Con este archivo tengo una terminal como fondo de pantalla, con las siguientes opciones:

  • pin: Para que aparezca en todos los escritorios.
  • geometry: Marca la geometría de la ventana en el formato (anchura)x(altura)+-(xoffset)+-(yoffset).
  • skip_pager: No mostrar en las áreas de trabajo.
  • skip_tasklist: No mostrar en la lista de tareas.
  • wintype: Especifica el tipo de ventana.

¿Complicado? Si tenéis alguna duda contactad conmigo e intentaré resolverlas.