Manual de creación y mantenimiento de clave GPG

Tener una clave no te garantiza recordar la contraseña

Vistos distintos manuales y blogs, recopilo aquí la experiencia con gnupg en Debian GNU/Linux.

Previo: modifica tu configuración a SHA2

Lo primero, vamos a cambiar la configuración de gpg para que utilice SHA2 en vez de SHA1. Por ello, añadimos estas líneas al final del archivo .gnupg/gpg.conf:

1
2
3
personal-digest-preferences SHA256
cert-digest-algo SHA256
default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed

Manual y ayuda

Recuerda que siempre puedes acceder al manual desde la terminal con man gpg, y también puedes ver una ayuda rápida con gpg --help.

Crear una nueva clave GPG

Creamos la clave con la opción --gen-key o si queremos que salgan todas las opciones con la opción --full-generate-key

1
gpg --full-generate-key

Tras un mensaje de gpg, saldrá este diálogo:

1
2
3
4
5
6
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)
Su elección:

RSA o DSA… elige lo que prefieras o bien la opción por defecto. Si quieres investigar más, puedes empezar por aquí: https://lists.gnupg.org/pipermail/gnupg-users/2004-June/022764.html

Una vez elegida esto, nos pedirá la longitud de la clave:

1
2
las claves RSA pueden tener entre 1024 y 4096 bits de longitud.
¿De qué tamaño quiere la clave? (3072)

Saldrán varias opciones, recomendamos preferiblemente de 4096 bit

También te pedirá si quieres que expire algún día o que no expire:

1
2
3
4
5
6
7
Por favor, especifique el período de validez de la clave.
         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
¿Validez de la clave (0)?

Entonces pasará a pedir unos datos:

  • Nombre y Apellidos
  • Dirección de correo electrónico
  • Comentario

Estos datos aparecerán tal que así:

1
"Nombre y apellidos (comentario) <cuenta@correo.org>"

Si nos equivocamos o queremos cambiarlo, podremos hacerlo luego.

Nos pedirá que confirmemos:

1
¿Cambia (N)ombre, (C)omentario, (D)irección o (V)ale/(S)alir?

Y pasaremos a la contraseña. En el diálogo, nos sale un aviso:

1
2
3
4
5
Es necesario generar muchos bytes aleatorios. Es una buena idea realizar
alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar
la red y los discos) durante la generación de números primos. Esto da al
generador de números aleatorios mayor oportunidad de recoger suficiente
entropía.

Una vez repitamos correctamente la contraseña, ya habremos creado la clave GPG.

Generar subclave

Parece una buena ida crear una subclave de la clave creada porque así utilizaremos esta en vez de la principal.

Dado que lo hacemos sobre nuestra clave, veamos si tenemos solo la nuestra o más claves, incluso nuestras antiguas, y editamos la que acabamos de crear:

1
gpg --list-keys cuenta@dominio.tld

Con el hash (sucesión de letras en mayúsculas y números) que salga después de pub se identifica la clave y se selecciona:

1
gpg --edit-key hash

El prompt de la consola cambiara al de gpg, y añadimos clave:

1
gpg> addkey

Hay que seleccionar el tipo de clave deseado, entre las siguientes opciones:

1
2
3
4
(3) DSA (sólo firmar)
(4) RSA (sólo firmar)
(5) ElGamal (sólo cifrar)
(6) RSA (sólo cifrar)

Seleccionamos la opción 6, ya que solo queremos cifrar con esta subclave.

La siguiente pregunta es qué longitud de bits queremos… cuanto más, mejor:

1
2
las claves RSA pueden tener entre 1024 y 4096 bits de longitud.
¿De qué tamaño quiere la clave? (3072)

A continuación, nos pregunta la caducidad de la clave:

1
2
3
4
5
6
7
El tamaño requerido es de 4096 bits
Por favor, especifique el período de validez de la clave.
         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

Nos pedirá la contraseña que antes hemos introducido y lo creara.

Ahora solo queda guardar con save

1
save

Añadir otra identidad

Para añadir otra identidad, tenemos que editar la clave con la opción --edit-key y el identificador de la clave:

1
gpg --edit-key hash

Así entramos en el prompt de gpg para editar esa clave.

Una vez en la consola de gpg, añadiremos la identidad con el comando adduid

1
adduid

Nos pedirá nombre, dirección de correo electrónico, un comentario (opcional) y validarlo o no. Entonces, pide la contraseña y se crea con la misma expiración que la identidad maestra.

Para finalizar, guardamos con save:

1
save

Establecer la identidad primaria

Si queremos cambiar la identidad primaria, editamos la clave con su hash y entramos en el prompt de gpg:

1
gpg --edit-key hash

Una vez ahí, seleccionamos la clave:

1
uid Número

Y la convertimos en primaria con primary:

1
primary

Por último, guardamos:

1
save

Listar las claves disponibles

Para saber qué claves tienes, tanto propias como ajenas, puedes listarlas con gpg --list-keys

También puede añadir patrones a acontinuación, como por ejemplo el nombre el correo electrónico o el dominio:

1
gpg --list-keys patrón

Exportar clave pública

Para enviar una clave púbica a la otra persona antes hay que exportarla con la opción --export y creando un archivo con la salida con la opción --output, más el identificador de la clave:

1
gpg --output clave-publica-exportada.gpg --export CLAVE_ID

De esta forma crearíamos la clave en formato binario, lo cual puede dar problemas cuando la enviamos por correo electrónico o la mostramos en una página web, por lo que añadiremos la opción --armor que fuerza que la salida sea en formato armadura ASCII:

1
gpg --armor --output clave-publica-exportada.gpg --export CLAVE_ID

Enviar la llave al servidor

Para enviar una clave al servidor, especificamos el servidor con la opción keyserver y la clave con la opción send-key:

1
gpg --keyserver servidor --send-key ID-de-tu-clave

Puedes enviarlo a uno, dos o varios servidores:

  • GNUPG, hkp://keys.gnupg.net
  • RedIris, hkp://pgp.rediris.es
  • MIT, hkp://pgp.mit.edu
  • PGP, hkp://subkeys.pgp.net

Importar clave pública gpg

Se pueden añadir claves públicas al anillo de claves públicas mediante la opción --import

De archivo local

1
gpg --import archivo-clave-gpg.asc

Lo podemos comprobar con la opción --list-keys o con la opción más concreta --list-public-keys

De servidor de claves

También lo podemos importar de un servidor de claves con la opción --keyserver, donde incluimos el servidor en cuestión, y --search-keys, donde ponemos el parámetro de búsqueda, algún dato que identifique esa clave, como puede ser el nombre, el correo electrónico o más concretamente su identificador de clave ID_CLAVE:

1
gpg --keyserver pgp.mit.edu --search-keys parámetro-de-búsqueda

De URL con wget

1
wget -O - url-de-clave.asc | gpg --import

De esta forma descargamos la clave y lo pasamos a STDOUT, para luego importarlo con gpg --import

Validez y firma de claves públicas

GnuPG utiliza un modelo de confianza que no requiere que quien la posee dé validez personalmente a cada clave que importe, pero algunas claves pueden necesitar esta validación personal.

La verificación se realiza comprobando la huella digital de la clave y firmando dicha clave, certificando su validez.

La huella digital se puede ver con la opción --fingerprint

1
gpg --fingerprint

Para certificarla hemos de editarla con la opción --edit-key

1
gpg --edit-key CLAVE_ID

Ahí entraremos en una consola de GnuPG desde donde podemos lanzar fpr para ver el fingerprint o huella dactilar de la clave.

1
gpg> fpr

La huella digital se verifica con quien posee la clave, en persona o por un medio feacientemente seguro.

Si la huella que ofrece es la misma que la clave, podemos estar seguro de la misma y se puede firmar para validarla con el comando sign

1
gpg> sign

Una vez firmada, podemos comprobar el listado de firmas que lleva la clave con el comando check

1
gpg> check

Revocación de claves

Para revocar la clave, hay que tener un certificado de revocación de claves por si se nos olvida la contraseña. De esta manera, publicaremos rápidamente que está revocada.

El certificado de revocación se crea con la opción --gen-revoke seguido del identificador de la clave.

A no ser que queramos copiar y pegar el texto de la terminal, podemos utilizar la opción --output para crear dar un nombre y crear el archivo con el certificado:

1
gpg --output revocacion-ID_CLAVE.cert --gen-revoke 0xIDCLAVE

En los motivos por los que solicitas el certificado puedes dar alguno o simplemente no especificar razón alguna.

Nos pedirá la contraseña.

Si queremos efectivamente revocar esa clave, usaremos el certificado importándolo a nuestro gpg con la opción --import y enviando la clave de nuevo al servidor público donde lo hayamos subido:

1
2
gpg --import revocacion-IC_CLAVE.crt
gpg --keyserver servidor --send-keys ID_CLAVE

Este certificado, al igual que todos sus datos, es importante mantenerlo a buen seguro. En este caso más porque podría comprometer su clave. Reproduzco el mensaje de aviso de gpg al crear el certificado:

Por favor consérvelo en un medio que pueda esconder; si alguien consigue acceso a este certificado puede usarlo para inutilizar su clave. Es inteligente imprimir este certificado y guardarlo en otro lugar, por si acaso su medio resulta imposible de leer. Pero precaución: ¡el sistema de impresión de su máquina podría almacenar los datos y hacerlos accesibles a otras personas!

Servidores de claves

Algunos de los servidores de claves más utilizados:

  • GNUPG, hkp://keys.gnupg.net
  • RedIris, hkp://pgp.rediris.es
  • MIT, hkp://pgp.mit.edu
  • PGP, hkp://subkeys.pgp.net

Aquí podremos enviar la clave, consultarlas por línea de comandos y también por su web, vía https.

Encriptar y desencriptar datos o cifrar y descifrar documentos

Es importante que entendamos cómo funciona el sistema de clave pública y privada, para ello utilizaremos la metáfora de la caja fuerte.

La clave pública es como una caja fuerte. Cuando la persona remitente cifra un documento usando una clave pública, ese documento se pone en la caja fuerte, la caja se cierra y se bloquea. Solo la persona que posee la clave privada de esa clave pública puede recuperar el documento cifrado con esa clave pública.

Cuidado con esto: si quieres enviar un texto a una persona, lo encriptas con su clave pública y borras el documento original, pierdes el documento ya que solo la otra persona será capaz de desencriptar tu documento encriptado.

Por tanto, si quieres mantener también una copia encriptada, encríptalo contra tu clave pública también.

Cifrar

Para cifrar un documento usamos la opción --encrypt, le damos una salida con la opción --output y elegimos la clave con la opción --recipient

Ojo, --recipient se usa una vez para cada clave destinataria:

1
gpg --output documento-firmado.gpg --encrypt --recipient CLAVE_ID documento-que-quiero-cifrar

Descifrar

Para descifrar usamos la opción --decrypt y una salida con --output

1
gpg --output documento-descifrado.pdf --decrypt documento-cifrado.gpg

Después de dar tu contraseña de la clave gpg, podrás descifrar el documento.

Cifrar con clave de cifrado simétrico

También es posible cifrar documentos sin la criptografía de clave pública con una clave de cifrado simétrico que cifre el documento con la opción –symmetric

1
gpg ---output documento-cifrado.gpg --symmetric documento-sin-cifrar

La clave deriva de la contraseña dada en el momento de cifrar el documento y NUNCA debe ser igual que la que protege la clave privada.

También puedes utilizar los atajos de las opciones, como por ejemplo para encriptar un archivo:

1
gpg -e -s -a archivo

Donde cada letra se corresponde con un atajo:

  • -e:: --encrypt
  • -s: --sign
  • -a: --armor

Firmar documentos y verificar firmas

Se firman documentos para certificar su autenticidad o añadir una marca de tiempo. Se utiliza el mismo par público y privado de claves pero en una operación diferente a la de cifrado y descifrado:

  1. Se genera una firma con la clave privada de quien firma.
  2. La firma se verifica por medio de la clave pública correspondiente.

Con la opción --sign se elige qué documento se quiere firmar y con la opción --output la salida del documento firmado.

1
gpg -output documento-firmado.sig -sign documento-que-se-quiere-firmar

El documento se comprime antes de ser firmado y la salida se produce en formato binario.

Para comprobar la firma, utilizamos la opción --verify y --decrypt para verificar la firma y recuperar el documento original al mismo tiempo. Con la opción --output damos salida a la opción verificación o descifrado:

1
2
gpg --output documento-estado-original --decrypt documento-firmado
gpg --output documento-estado-original --verify documento firmado

Enlaces

Adolfo Antón Bravo
Adolfo Antón Bravo
Coordinador del Máster de Periodismo y Visualización de Datos de la Universidad de Alcalá

Periodismo y visualización de datos, web semántica, bash, emacs, orgmode