GnuPG

GnuPG

Notas y consideraciones

Terminologia

fingerprint

huella

keyring

llavero

entropia

cantidad de información / aleatoriedad

GNU/Linux y entropia

GNU/Linux y otros sistemas operativos basados en Unix disponen de una funcionalidad incorporada en el kernel (núcleo) con la finalidad de proveer al sistema de números aleatorios cuando hace falta. Para que estos números aleatorios sean impredecibles, el kernel recoge entropía (información) de diferentes eventos del sistema indeterministas (interrupciones de teclado y raton, tiempos entre paquetes de red, etc.) para alimentar al generador de números aleatorios.

GnuPG requiere de gran cantidad de números aleatorios (y por lo tanto, entropía) para generar llaves. Para acelerar el proceso de creación de llaves podemos instalar haveged para que alimente la fuente de entropía del núcleo:

HAVEGE is a random number generator that exploits the modifications of the internal CPU hardware states (caches, branch predictors, TLBs) as a source of uncertainty.

Nota: En las maquinas virtuales el uso de haveged puede debilitar la calidad de la aleatoriedad generada por el kernel. En el caso de VirtualBox, por defecto, la instrucción para medir tiempos (usada por haveged para recolectar entropia) se pasa directamente a la CPU real y por lo tanto obtiene la misma calidad de entropia que en un sistema sin virtualización. En otras maquinas virtuales se debe tener en cuenta como la VM trata la instrucción rdtsc. Mas información en: https://security.stackexchange.com/questions/34523/is-it-appropriate-to-use-haveged-as-a-source-of-entropy-on-virtual-machines

gpg.conf

Es muy recomendable utilizar una configuración más extendida de GnuPG de la que viene por defecto en las distribuciones. Para eso debemos editar el fichero ~/.gnupg/gpg.conf. Os recomendamos encarecidamente que utilicéis ésta configuración en el fichero ~/.gnupg/gpg.conf

Para usar esta configuración hace falta bajar el certificado que usa el servidor de llaves sks-keyservers:

wget https://sks-keyservers.net/sks-keyservers.netCA.pem -O ~/.gnupg/sks-keyservers.netCA.pem

En el fichero ~/.gnupg/gpg.conf modificaremos la linia referente al certificado y la dejaremos de esta forma:

keyserver-options ca-cert-file=~/.gnupg/gpg.conf

TODO: traducir los comentarios de la configuración y añadirla a la wiki.

Hace falta instalar el paquete gnupg-curl en Debian para poder conectarse a los servidores de llaves por hpks (conexión cifrada).

=== ID corto ===

Los ID de 32 bits son débiles! Usar siempre el fingerprint para identificar inequívocamente una llave: * https://evil32.com/ * https://pgp.mit.edu/pks/lookup?search=0x10000001&op=index

== Generación y gestión de llaves ==

Generación de una llave gpg. {{{ $ gpg –gen-key }}}

Listar todas las llaves. {{{ $ gpg –list-keys }}}

Generar un certificado de revocación. {{{ $ gpg –output revoke.asc –gen-revoke 75447B14 }}}

Editar nuestra llave.

Por ejemplo podemos añadir una nueva identidad: podemos tener diferentes correos usando la misma llave gpg. Hay que tener en cuenta que al juntar diferentes identidades con una misma llave gpg estamos revelando que esas identidades están relacionadas: son de la misma persona. Si deseamos una identidad con nuestro nombre real y otra identidad con un seudónimo que no queremos que sea fácilmente relacionable con nosotros, seria mejor usar llaves gpg diferentes. {{{ $ gpg –edit-key > adduid … > save }}}

Exportar una llave en un fichero.

‘’Nota’’: el parámetro –armor genera una salida de texto en ASCII, para facilitar la compartición de la llave (por ejemplo, por correo o en una pagina web). Sin este parámetro el resultado es un fichero binario. Este parametro aplica a la mayoria de operaciones con gpg que generan un archivo de salida. {{{ $ gpg [–armor] –output larry.asc –export larry@gentoo.org }}}

Importar una llave des de un fichero. {{{ $ gpg –import luis.asc }}}

Firmar una llave. {{{ $ gpg –edit-key lmpinto@dei.uc.pt > sign }}}

Enviar la llave al servidor de llaves. {{{ $ gpg –send-key 75447B14 }}}

Buscar una llave en los servidores a partir de una identidad, fingerprint, ID… {{{ $ gpg –search-keys larry@gentoo.org }}}

Importar una llave des de los servidores a partir de un fingerprint, ID, … {{{ $ gpg –recv-keys 00AA11BB }}}

El siguiente comando se conecta al servidor de llaves y actualiza todas las llaves de nuestro keyring (descarga certificados de revocación pertinentes, actualiza las fechas de caducidad, baja nuevas firmas disponibles, nuevas identidades, …). Es importante ejecutar este comando regularmente (una o dos veces al mes). De esta forma sabremos cuando una llave ha sido revocada y no debe ser usada. {{{ $ gpg –refresh-keys }}}

== Cifrado y firmado ==

=== Cifrar y descifrar ===

Cifrar para un destinatario (necesitamos su llave publica en nuestro keyring). Con la opción –encrypt-to también ciframos el mensaje para nuestra ID (0x3FAD9F1E). De esta forma nosotros también seremos capaces de descifrar el mensaje. Podemos añadir esta opción en nuestro gpg.conf mediante “encrypt-to 0x3FAD9F1E”. {{{ $ gpg –recipient bobbone@cowtownu.edu [–armor] [–encrypt-to 0x3FAD9F1E] –output your-file.asc –encrypt my-file.txt }}}

Cifrado simétrico mediante contraseña (en este caso no utilizamos criptografía asimétrica). {{{ $ gpg –symmetric my-file.txt }}}

Desciframos el archivo my-file.gpg. Tanto si se ha usado criptografía asimétrica como simétrica. En el segundo caso deberemos poner la contraseña usada para cifrar. {{{ $ gpg –output my-file.txt –decrypt my-file.gpg }}}

=== Firmar y verificar ===

Firmar un archivo (el nuevo fichero contiene el archivo y la firma). {{{ $ gpg [–armor] –sign my-file.txt }}}

Firmar un archivo (el nuevo fichero contiene el archivo y la firma) manteniendo el archivo original en texto claro. {{{ $ gpg –clearsign my-file.txt }}}

Verificar la firma del archivo my-file.gpg. {{{ $ gpg –verify my-file.gpg }}}

Verificar firma y ‘’extraer contenidos’’. {{{ $ gpg –output your-file.txt –decrypt my-file.gpg }}}

Firmar en un archivo separado. Este caso es muy útil y se usa muy comúnmente. Por ejemplo algunas distribuciones de GNU/Linux suben la firma de las imágenes de instalación por separado. {{{ $ gpg [–armor] –detach-sign my-file.zip }}}

Verificar la firma my-file.sig del fichero my-file.txt. {{{ $ gpg –verify my-file.sig my-file.txt }}}

=== Cifrar y firmar, descifrar y verificar ===

Cifrar y firmar un archivo para Bob. {{{ $ gpg –armor –recipient Bob –encrypt –sign my-file.txt }}}

Descifrar y verificar un archivo. Debemos prestar atención a los mensajes que aparecen al ejecutar este comando para fijarnos que características tiene el fichero (en nuestro caso seria cifrado y firmado, pero puede ser cualquier combinación de los dos). {{{ $ gpg –output your-file.txt –decrypt my-file.asc }}}

== Firmado de llaves (manual) ==

Firmar una identidad es la forma establecer nuestro nivel de confianza hacia esa llave. Con esta operación estamos dando una garantía de que la identidad que aparece en esa llave (indicada mediante nombre y correo) posee y controla la llave privada asociada a esa llave publica.

Recibe la llave des del servidor. {{{ $ gpg –recv-keys E4758D1D }}}

Firma la llave (esto es un atajo de usar –edit-key y ejecutar el comando sign). {{{ $ gpg –sign-key E4758D1D }}}

Exporta la llave con las firmas a un fichero ASCII.

Envía las firmas por correo a la dirección/es correspondientes a los UIDs de la llave, cifrados a poder ser. Al enviar las firmas cifradas nos aseguramos que quien obtiene nuestra firma efectivamente es capaz de descifrarla y por tanto posee control sobre la llave privada correspondiente. {{{ $ gpg –armor –output E4758D1D.signed-by.01234567.asc –export E4758D1D }}}

Importamos las firmas que nos han mandado. {{{ $ gpg –import 01234567.signed-by.E4758D1D.asc }}}

Podemos ver las firmas locales que tiene nuestra llave (o cualquier otra llave de nuestro keyring). {{{ $ gpg –list-sigs 01234567 }}}

Enviamos la llave al servidor, junto con las firmas. {{{ $ gpg –send-keys 01234567 }}}

== Paquete signing-party de Debian ==

El paquete [[https://packages.debian.org/stable/signing-party|signing-party de Debian]] recoge varias herramientas útiles para las fiestas de signaturas. A continuación mostramos algunos ejemplos.

Podemos automatizar el proceso de firmar llaves de otras personas que hemos verificado previamente (hemos verificado su fingerprint y sabemos que la identidad que aparece en la llave corresponde a esa persona) mediante caff. Esta herramienta buscara en los servidores de llaves la llave correspondiente al fingerprint que le indiquemos. Una vez encontrada nos la mostrara y nos pedirá, por cada identidad de la llave, si queremos firmarla. Una vez hayamos firmado la/s identidad/es, nos ofrece enviar estas firmas a los correos correspondientes de las identidades, cifrando el mensaje. Para poder usar la funcionalidad de enviar correos debemos tener [[Exim|Exim configurado correctamente]]. {{{ caff “0xE285 24CA F492 F934 A4C2 384A BCBB 88F1 9F50 B17B” }}}

La siguiente herramienta genera un documento PostScript con tiras para recortar con nuestro fingerprint GPG y nuestras identidades. Ideal para imprimir y recortar y dar a nuestros contactos para facilitar el intercambio de fingerprints y firmado de llaves. {{{ $ gpg-key2ps -p a4 1A2B3C4D > slips.ps }}}

== Otros ==

=== RSA de 2048 vs 4096 bits === Las llaves RSA de 2048 bits son suficientemente largas para la mayoría de los casos: https://www.gnupg.org/faq/gnupg-faq.html==no_default_of_rsa4096 El incremento de seguridad al pasar de 2048 bits a 4096 no compensa el coste adicional que conlleva.

=== Caducidad de las llaves === Fecha de validez de las llaves: recomendado entre 1 y 2 años. Es muy útil tener una fecha de caducidad en nuestras llaves, ya que si perdemos el acceso a nuestra llave privada nos permitirá que la gente sepa que nuestra llave ya no es valida (una vez caduque). Podemos ir extendiendo la fecha de caducidad sin necesidad de generar una nueva llave: {{{ $ gpg –edit-key E4758D1D > expire yyyy-mm-dd }}}

=== Temas no vistos ===

  • Gestión de subllaves

== Recursos ==

  • https://wiki.archlinux.org/index.php/GnuPG
  • https://www.gnupg.org/faq/gnupg-faq.html
  • https://wiki.gentoo.org/wiki/GnuPG
  • http://spywarewarrior.com/uiuc/gpg/gpg-com-4.htm#2-5
  • $ man gpg