Las tarjetas criptográficas son un tipo de tarjeta inteligente que tienen un circuito integrado que permite almacenar certificados digitales con sus claves privadas y realizar operaciones criptográficas. Tener los certificados y sus claves privadas en la tarjeta ofrece mayor seguridad ya que las claves privadas no son accesibles desde el ordenador, es el circuito integrado de la tarjeta el que se encarga de realizar las operaciones de firma y descifrado con la clave privada. Esto permite que las tarjetas se puedan utilizar para la autenticación en cualquier ordenador o sistema de acceso.
Para utilizar tarjetas criptográficas es necesario tener un lector de tarjetas inteligentes como por ejemplo el SCR 3310v2. Este lector cumple con estándares como PC/SC y CCID para su utilización desde diferentes sistemas.
Hay múltiples fabricantes de tarjetas criptográficas, para este artículo voy a utilizar la tarjeta de la FNMT (Fabrica Nacional de Moneda y Timbre). Esta tarjeta también cumple estándares de comunicación como PC/SC y PKCS#11.
Las tarjetas inteligentes pueden ser con contacto o sin contacto. En las de contacto el circuito integrado tiene 6 u 8 contactos para comunicarse con el lector. En las de sin contacto la comunicación se realiza por el aire, a poca distancia, mediante ondas electromagnéticas. En algunas tarjetas se incluyen los dos sistemas.
A continuación se muestra la función de los 8 contactos de las tarjetas inteligentes. En las de 6 contactos no se incluyen los contactos C4 y C8.
- C1: Voltaje de alimentación del circuito integrado.
- C2: Reinicio del circuito integrado.
- C3: Señal de reloj para el circuito integrado.
- C4: Otros usos.
- C5: Conexión a tierra del circuito integrado.
- C6: Alto voltaje para programación de memorias u otros usos.
- C7: Entrada y salida de datos.
- C8: Otros usos.
Windows es probable que detecte el lector y lo configure automáticamente, si no es así podemos descargar el controlador desde la web del fabricante. En Linux debemos instalar PCSC-Lite. Junto con este software se instalará también la biblioteca libccid. Con el comando pcsc_scan se pueden ver los lectores conectados al ordenador así como las tarjetas insertadas en los lectores.
# apt-get install pcscd pcsc-tools # pcsc_scan PC/SC device scanner V 1.6.2 (c) 2001-2022, Ludovic Rousseau <[email protected]> Using reader plug'n play mechanism Scanning present readers... 0: SCM Microsystems Inc. SCR 3310 [CCID Interface] 00 00 Sun Jan 21 12:45:55 2024 Reader 0: SCM Microsystems Inc. SCR 3310 [CCID Interface] 00 00 Event number: 0 Card state: Card inserted, ATR: 3B 7F 96 00 00 00 6A 46 4E 4D 54 03 04 11 43 04 30 03 90 00 ATR: 3B 7F 96 00 00 00 6A 46 4E 4D 54 03 04 11 43 04 30 03 90 00 + 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: 00 6A 46 4E 4D 54 03 04 11 43 04 30 03 90 00 Category indicator byte: 00 (compact TLV data object) Tag: 6, len: A (pre-issuing data) Data: 46 4E 4D 54 03 04 11 43 04 30 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): 3B 7F 96 00 00 00 6A 46 4E 4D 54 03 04 11 43 04 30 03 90 00 CERES Spanish SmartCard from the "Fabrica Nacional de Moneda y Timbre" (FNMT) (eID) http://www.cert.fnmt.es/
La tarjeta también necesita un controlador que podemos descargar de la web del fabricante. Para Debian y otras distribuciones Linux podemos descargar un paquete en el que se encuentra la biblioteca libpkcs11-fnmtdnie.so. Esta biblioteca la podrán utilizar los programas para comunicarse con la tarjeta. Es necesario instalar el paquete pinentry-gtk2.
# wget https://www.sede.fnmt.gob.es/documents/10445900/11635653/libpkcs11-fnmtdnie_1.6.9_amd64.deb # apt-get install pinentry-gtk2 # dpkg -i libpkcs11-fnmtdnie_1.6.9_amd64.deb
En la web de la FNMT también se encuentran varios programas para manejar la tarjeta. Por ejemplo con el programa "Importador de Certificados" podremos importar en la tarjeta certificados y claves privadas contenidos en archivos PKCS#12 En los certificados va incluida la clave pública.
Los archivos EXE disponibles para Windows en realidad son archivos JAR de Java y los podremos ejecutar también en Linux. Es posible que al ejecutarlos recibamos el error "VERSIÓN DE VM NO COMPATIBLE". En este caso es necesario usar una versión de la máquina virtual Java anterior.
# apt-get install openjdk-8-jre # /usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar Importador\ de\ Certificados.exe
Para poder utilizar el lector de tarjetas en un navegador como Firefox debemos configurar un "Dispositivo de Seguridad". En Menú -> Ajustes -> Privacidad & Seguridad -> Certificados -> Dispositivos de Seguridad -> Cargar tenemos que seleccionar la biblioteca /usr/lib/libpkcs11-fnmtdnie.so. En el administrador de certificados podremos ver los certificados de la tarjeta. Para ello se nos pedirá la contraseña que protege el acceso a la tarjeta. Cuando conectemos a una web con uno de esos certificados, la tarjeta se encargará de realizar las operaciones criptográficas que sea necesario hacer con las claves privadas.
Otro software que nos puede resultar útil es OpenSC. Con el comando pkcs11-tool podemos administrar los certificados y claves de la tarjeta. Con el parámetro --list-objects podemos ver como en la tarjeta hay un certificado, una clave privada y una clave pública. En las claves se indica su uso y acceso. La clave privada se usa para descifrar y firmar, la clave pública para cifrar y verificar la firma. La clave privada no se puede extraer de la tarjeta y la pública si.
# apt-get install opensc # pkcs11-tool --module /usr/lib/libpkcs11-fnmtdnie.so --list-objects --pin aaaaaa Using slot 0 with a present token (0x10000) Certificate Object; type = X.509 cert label: Alejandro Sánchez subject: DN: C=ES, ST=Madrid, O=Cuaderno Inform\xC3\xA1tica, CN=Alejandro S\xC3\xA1nchez/[email protected] ID: f53769e8d42bb477e9fdc0126a4939e7fb3fc7a8 Private Key Object; RSA label: Alejandro Sánchez ID: f53769e8d42bb477e9fdc0126a4939e7fb3fc7a8 Usage: decrypt, sign Access: sensitive, always sensitive, never extractable Public Key Object; RSA 2048 bits label: Alejandro Sánchez ID: f53769e8d42bb477e9fdc0126a4939e7fb3fc7a8 Usage: encrypt, verify Access: none
Esto es lo básico que necesitamos saber para utilizar tarjetas criptográficas. Si tenemos alguna necesidad especial podemos investigar los protocolos y software mencionados. En el futuro espero poder escribir un artículo sobre tarjetas criptográficas sin contacto. Para saber más sobre certificados digitales se puede leer el artículo Autoridad de Certificación con OpenSSL.