Configurar una Yubikey con GnuPG en Fedora

Posted on dom 12 noviembre 2017

En esta serie veremos diversos elementos relacionados con GnuPG y Yubikey como Smartcard. Los post son específicos para Yubikey 4, pero podrían funcionar con Yubikey-Neo con algunas modificaciones.

Estos ejemplos están probados en:

  • Fedora 26
  • GnuPG 2.2.1
  • Yubikey 4 (v2.1)

Verificar la Yubikey

Para los siguientes ejemplos se usará GnuPG2 ya que éste soporta llaves RSA de 4096. Comenzaremos verificando si se detecta la yubikey correctamente:

gpg2 --card-status

Deberíamos obtener una salida como la siguiente:

Reader ...........: Yubico Yubikey 4 OTP U2F CCID 00 00
Application ID ...: D2760X0XXXX10X0100060X2135710000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 01211511
Name of cardholder: [no establecido]
Language prefs ...: [no establecido]
Sex ..............: no especificado
URL of public key : [no establecido]
Login data .......: [no establecido]
Signature PIN ....: no forzado
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

En caso que no nos arroje algo así, deberemos probar en otro puerto USB o deteniendo el PCSC:

sudo systemctl stop pcscd

Luego intentar nuevamente con el primer comando.

Creación de la llave

Yubikey 4 soporta llaves RSA (2048, 4096) y ECC (p256, p384). Existen 2 formas de crear la llave:

  • Crear la llave en la yubikey: es la forma más segura ya que la llave privada nunca deja el dispositivo USB. Se crea en ella y es imposible exportarla. Su contra está en que no existe forma de crear un respaldo.

  • Crear la llave en el computador y cargarla a la yubikey: este método es más flexible. Permite crear un respaldo de la llave privada o usar una llave ya creada previamente.

Creación de la llave en el computador (o usar una llave existente)

En este método debemos contar con una llave RSA. Podemos usar una creada previamente o crear una nueva.

Creación de la llave

  1. Iniciamos la creación de la llave gpg2 --expert --full-gen-key
  2. Seleccionamos el tipo de llave:

    Por favor seleccione tipo de clave deseado:
      (1) RSA y RSA (por defecto)
      (2) DSA y ElGamal
      (3) DSA (sólo firmar)
      (4) RSA (sólo firmar)
      (7) DSA (permite elegir capacidades)
      (8) RSA (permite elegir capacidades)
      (9) ECC and ECC
     (10) ECC (sign only)
     (11) ECC (set your own capabilities)
     (13) Existing key
    

    Debemos elegir RSA y RSA

  3. Elegimos el tamaño de la llave y subllave (2048 o 4096)

  4. Elegimos la duración de la llave. Por defecto 0, sin caducar.
  5. Ingresamos nombre y apellido para la llave
  6. Ingresamos el correo asociado a la llave
  7. Ingresamos un comentario opcional
  8. Nos da la opción de agregar un clave para proteger la llave. Seguir los consejos para generar entropía. Al finalizar nos saldrá el resumen:

    claves pública y secreta creadas y firmadas.
    
    pub   rsa2048 2017-11-13 [SC]
          E13AFFD9469092542791CB2535285AFCE0ED7F45
    uid                      Juan Pérez <jp@example.com>
    sub   rsa2048 2017-11-13 [E]
    
  9. Agregamos las subllave, para ello ingresamos al modo edición:

    gpg2 --expert --edit-key jp@example.com
    
  10. Ingresamos el comando addkey

    Elegimos RSA (sólo firmar), indicamos el tamaño y la duración.

  11. Ingresamos el comando addkey

    Elegimos RSA (permite elegir capacidades), debemos usar F, C, A para alternar la capacidad de la llave indicada en Acciones permitidas actualmente: hasta que quede sólo Autentificación. Una vez hecho, presionar S. Elegir tamaño y duración.

  12. Si necesitamos, podemos agregar otras identidades a la llave con el comando adduid. Nos solicitará nombre, apellido y correo.

  13. Guardamos los cambios con save

  14. Exportamos las llaves con:

    gpg2 --armor --export-secret-keys jp@example.com > respaldo_secreto_gpg.key
    

    Mantener dicho archivo bajo total cuidado.

Pasar la llave GnuPG a la yubikey

  1. Insertamos la yubikey en el USB y validamos si es detectada (paso ya indicamos arriba)
  2. Entramos en modo edición

    gpg2 --expert --edit-key jp@example.com
    ...
    ...
    sec  rsa2048/BA1D54E27D357BCD
         ccreado: 2017-11-13  caduca: nunca       uso: SC  
         confianza: absoluta      validez: absoluta
    ssb  rsa2048/F1C1D21AB68CC384
         creado: 2017-11-13  caduca: nunca       uso: E   
    ssb  rsa2048/8A9A91B693E1E57E
         creado: 2017-11-13  caduca: nunca       uso: S   
    ssb  rsa2048/C8C3802A62992F34
         creado: 2017-11-13  caduca: nunca       uso: A
    
  3. Ingresamos comando key 1 y veremos que se selecciona la primera entrada ssb, quedando ssb* y que en este caso corresponde a uso: E

  4. Ejecutamos comando keytocard, debemos elegir la opción Clave de cifrado. Con ello se pará la subllave a la yubikey.
  5. Ingresamos comando key 1 seguido de key 2. Deberá estar con ssb* solo la subllave que indica uso: S
  6. Ejecutamos comando keytocard, debemos elegir Clave de firmado
  7. Ingresamos comando key 2 seguido de key 3. Deberá estar con ssb* solo la subllave que indica uso: A
  8. Ejecutamos comando keytocard
  9. Finalmente guardamos los cambios con save

Debemos exportar la llave pública para poder usar la yubikey en otros computadores (Explicado más abajo).

Creación de la llave en la yubikey

  1. Insertamos la yubikey en el USB y validamos si es detectada (paso ya indicamos arriba)
  2. Edición de smartcard

    gpg2 --card-edit
    ...
    ...
    gpg/tarjeta>
    
  3. Pasamos al modo admin gpg/tarjeta> admin e ingresamos el comando para generar la llave generate

    Te consultará si quieres guardar una copia externa. Indica no (n) ya que ese respaldo no sirve.

    Te solicitará el PIN, por defecto en la yubikey 123456

  4. Elegir el tamaño de la llave de firmado. Por defecto es 2048 pero puedes ampliarla hasta 4096 (aplica también para los puntos 5 y 6)

    Te solicitará el PIN de admin, por defecto en la yubikey es 12345678

  5. Elegir el tamaño de la llave de cifrado

  6. Elegir el tamaño de la llave de autenticación
  7. Elegir la duración de la llave. Por defecto es 0. Las opciones son:

       0 = la clave nunca caduca
    <n>  = la clave caduca en n días
    <n>w = la clave caduca en n semanas
    <n>m = la clave caduca en n meses
    <n>y = la clave caduca en n años
    

    Confirmamos la duración.

  8. Ingresamos el nombre y apellido para la llave

  9. Ingresamos el correo asociado a la llave
  10. Podemos agregar algún comentario para la llave
  11. Validamos los datos en el resumen que se presenta y finalmente confirmamos
  12. Ingresamos nuevamente PIN de admin

Con esto ya tendremos la yubikey con una llave RSA, la cual es accedida por GnuPG como si fuera un Smartcard.

Debemos exportar la llave pública para poder usar la yubikey en otros computadores (Explicado más abajo).

Usar la yubikey en otro computador

Para poder usar la yubikey en otro equipo debemos contar con la parte pública (explicado arriba).

  1. Importar la llave pública:

    gpg2 --import archivo_llave_publica.gpg
    
  2. Insertar la yubikey y ejecutar gpg2 --card-edit, una vez en modo edición usamos el comando fetch

  3. Validamos que esté disponible la llave
    sec>  rsa4096 2017-11-13 [SC] [caduca: 2019-11-13]
          F789EB5B1A5F55DF7F89D2450B1E0D6865FDE183
          Número de serie de la tarjeta = 0006 05213571
    uid           [  absoluta ] Juan Pérez <juan@example.com>
    ssb>  rsa2048 2017-11-13 [A] [caduca: 2019-11-13]
    ssb>  rsa2048 2017-11-13 [E] [caduca: 2019-11-13]