HowTo GnuPG

index | OSiUX | blog | docs | charlas | links

Instalando GnuPG

En distribuciones de GNU/Linux como Debian o Ubuntu, para instalar gnupg y demás programas, solo hace falta ejecutar el siguiente comando:

aptitude install gnupg 

Generando nuestra llave pública/privada

Una vez instalado, debemos generar la llave:

gpg --gen-key

Donde debemos elegir el tipo de llave, por lo general DSA and ElGamal, es suficiente:

Please select what kind of key you want:
   (1) DSA and ElGamal (default)
   (2) DSA (sign only)
   (4) ElGamal (sign and encrypt)
   (5) RSA (sign only)
   Your selection? 1

Lo próximo será elegir el tamaño de la llave, en el ejemplo elegimos 2048 y que nunca expire. Lo recomendable es que si expire, al menos dentro de un año, por si alguna vez nuestra llave se ve comprometida o perdemos la clave o casos similares donde no podriamos volver a acceder a esta.

DSA keypair will have 1024 bits.
About to generate a new ELG-E keypair.
              minimum keysize is  768 bits
              default keysize is 1024 bits
    highest suggested keysize is 2048 bits
    What keysize do you want? (1024) 2048
Requested keysize is 2048 bits       
Please specify how long the key should be valid.
         0  key does not expire
 <n> key expires in n days
 <n>w  key expires in n weeks
 <n>m  key expires in n months
 <n>y  key expires in n years
 Key is valid for? (0) 0
Key does not expire at all

Una vez completado lo anterior, nos preguntará si es correcta la información que ingresamos, a lo cual respondemos que si.

Luego nos pedirá un nombre, un e-mail y un comentario (donde podriamos ingresar nuestro nickname, aunque tranquilamente podríamos dejarlo vacio) y nuestra passphrase que utilizaremos para des/encriptar, firmar correos electronicos y archivos que queremos mantener privados.

Nota: en el momento de generar la clave, debemos generar entropía para acelerar el proceso de la creación de la llave, la cual puede ser generada ejecutando ls -lR / o cat /dev/urandom o ambos al mismo tiempo :)

Is this correct (y/n)? y

You need a User-ID to identify your key; the software constructs the user id
from Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Juan Carlos Petela
Email address: juanca@petela.org
Comment: jcpetela
You selected this USER-ID:
"Juan Carlos Petela (jcpetela) <juanca@petela.org>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O 
You need a Passphrase to protect your secret key.    

Enter passphrase: 

Una vez completado esto, veremos algo similar a:

gpg: key 0D34DB33F marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 2 signed: 1 trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: depth: 1 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 1f, 0u
pub 1024D/069C39A4 2008-01-28
Key fingerprint  5F6E E259 945A 0D51 32BD 1874 A46F A22D D34D B33F
uid Juan Carlos Petela (jcpetela) <juanca@petela.org>
sub 2048g/BC9EC4CB 2008-09-09 

Ahora debemos enviar nuestra llave a algún servidor (utilizando nuestra key-id para identificarla) para que este disponible a otros usuarios.

Nota: normalmente, con nuestracon los ultimos 8 caracteres (D34DB33F) de nuestra fingerprint (5F6E E259 945A 0D51 32BD 1874 A46F A22D D34D B33F) es suficiente, pero también puede realizarse utilizando los ultimos 16 (1874A46FA22DD34DB33F)

gpg --keyserver subkeys.pgp.net --send-key 0D34DB33F

En caso de olvidarnos nuestra key-id, podemos encontrarla ejecutando cualquiera de los siguientes comandos:

gpg --list-key juanca@petela.org 
---
gpg --list-key juan carlos petela 

Lo cual debería devolverlos algo similar a:

pub   1024D/0D34DB33F 2008-09-09
uid                  Juan Carlos Petela (jcpetela) <juanca@petela.org>
sub   4096g/AB0B4D9C 2008-09-09

Donde 0D34DB33F es nuestra key-id.

Exportando nuestra llave pública

Para exportar nuestra clave debemos ejecutar:

gpg --export -a 0D34DB33F 

Y para guardarla en un archivo

gpg --export -a 0D34DB33F > jcpetela.asc

Agregando nuevas identidades a nuestra llave

A veces se da el caso de que tenemos mas de una cuenta de email que utilizamos y nos gustaria que todas esas cuentas pudieran ser utilizadas al mismo tiempo para firmar y cifrar archivos o correos electronicos.

Para lograr esto, debemos realizar lo siguiente:

gpg --edit-key 0D34DB33F

De esta manera entraremos al menu donde debemos ejecutar adduid, que de la misma manera que cuando generamos nuestras llaves, nos pedira un nombre, un email y un comentario y luego ingresar nuestra passphrase:

Orden> adduid 
Nombre y apellidos: Juan Carlos Petela
Dirección de correo electrónico: juanca@gmail.com
Comentario: jcpetela
Ha seleccionado este ID de usuario:
    "Juan Carlos Petela (jcpetela) <juanca@gmail.com>"

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

Necesita una frase contraseña para desbloquear la clave secreta
del usuario: "Juan Carlos Petela (jcpetela) <juanca@petela.org>"
clave DSA de 1024 bits, ID 0D34DB33F, creada el 2008-09-09

pub  1024D/0D34DB33F  creado: 2008-09-09  uso: SC  
                     confianza: absoluta      validez: absoluta
sub  2048g/012304CD  creado: 2008-09-09  uso: E   
[  absoluta ] (1)  Juan Carlos Petela (jcpetela) <juanca@petela.org>
[desconocida] (2)  Juan Carlos Petela (jcpetela) <juanca@gmail.com>

Si queremos modificar el estado de ’desconocida’ a ’absoluta’, debemos hacerlo mediante el comando ’trust’.

Primero debemos seleccionarla:

Orden> 2

Por favor, decida su nivel de confianza en que este usuario
verifique correctamente las claves de otros usuarios (mirando
pasaportes, comprobando huellas dactilares en diferentes fuentes...)

 1  No lo sé o prefiero no decirlo
 2  NO tengo confianza
 3  Confío un poco
 4  Confío totalmente
 5  confío absolutamente
  m  volver al menú principal

¿Su decisión? 5
¿De verdad quiere asignar absoluta confianza a esta clave? (s/N) s

De esta manera declaramos la confianza absoluta en la nueva identidad.

Quizas el programa nos advierta lo siguiente:

Por favor, advierta que la validez de clave mostrada no es necesariamente correcta a menos de que reinicie el programa.

Lo haga o no, para guardar los cambios, antes debemos ejecutar el comando ``save`` que nos pedira la passphrase.

Revocando nuestra llave

En caso de haber perdido o que nuestra llave se vea comprometida, lo correcto seria revocarla para no comprometer nuesta ’’red de confianza’’, que puedan decifrar archivos privados y/o firmar por nosotros cosas que no conocemos.

Para realizar una revocacion, debemos ejecutar el siguiente comando:

gpg --gen-revoke 0D34DB33F

Donde aparecera una pantalla donde nos preguntará la passphrase y porque queremos revocarla.

Ahora si en nuestra llave publica tenemos varias identidades (juanca@petela.org y juanca@gmail.com) y queremos borrar la cuenta de gmail.com, solo debemos ejecutar lo siguiente:

gpg --edit-key 0D34DB33F

De esta manera entraremos en el menu que se veria similar a esto:

pub  1024D/0D34DB33F  creado: 2008-09-09  uso: SC  
                     confianza: absoluta      validez: absoluta
sub  2048g/012304CD  creado: 2008-09-09  uso: E   
[  absoluta ] (1)  Juan Carlos Petela (jcpetela) <juanca@petela.org>
[  absoluta ] (2)  Juan Carlos Petela (jcpetela) <juanca@gmail.com>

Primero debemos seleccionar la cuenta presionando en este caso el numero 2, ya que ese es el identificado de nuestra cuenta en gmail.com.

Una vez realizado, veremos que el menu cambiara a:

pub  1024D/0D34DB33F  creado: 2008-09-09  uso: SC  
                     confianza: absoluta      validez: absoluta
sub  2048g/012304CD  creado: 2008-09-09  uso: E   
[  absoluta ] (1)  Juan Carlos Petela (jcpetela) <juanca@petela.org>
[  absoluta ] (2)* Juan Carlos Petela (jcpetela) <juanca@gmail.com>

Ahora solo resta, ejecutar el comando revuid dentro de la línea de comandos de gpg:

Orden> revuid 
¿Revocar realmente este identificador de usuario? (s/N) s
Por favor elija una razón para la revocación:
  0  No se dio ninguna razón
  4  El identificador de usuario ya no es válido
  Q  Cancelar
(Probablemente quería seleccionar 4 aquí)

En este caso elegimos la opción 4, aunque la opción 0 también es válida.

Luego, nos pedirá una razón de porque estamos revocando la cuenta, podemos dejar el campo vacío. Y para finalizar debemos ingresar nuestra passphrase.

¿Su decisión? 4
Introduzca una descripción opcional; acábela con una línea vacía:
> Deje de utilizar la cuenta en gmail.com
> 
Razón para la revocación: El identificador de usuario ya no es válido
Deje de utilizar la cuenta en gmail.com
¿Es correcto? (s/N) s
Necesita una frase contraseña para desbloquear la clave secreta
del usuario: "Juan Carlos Petela (jcpetela) <juanca@petela.org>"
clave DSA de 1024 bits, ID 0D34DB33F, creada el 2008-09-09

Introduzca frase contraseña: 

Una vez realizado todo esto, veremos que la cuenta de gmail.com ahora esta marcada como revocada, por lo que ya no podemos seguir utilizandola.

pub  1024D/0D34DB33F  creado: 2008-09-09  uso: SC  
                     confianza: absoluta      validez: absoluta
sub  2048g/012304CD  creado: 2008-09-09  uso: E   
[  absoluta ] (1)  Juan Carlos Petela (jcpetela) <juanca@petela.org>
[  revocada ] (2)  Juan Carlos Petela (jcpetela) <juanca@gmail.com>

En caso de querer borrar nuestra identidad de la cuenta en gmail.com, debemos ejecutar el comando deluid siguiendo el mismo procedimiento que para revocarla:

Orden> 2

pub  1024D/0D34DB33F  creado: 2008-09-09  uso: SC  
                     confianza: absoluta      validez: absoluta
sub  2048g/012304CD  creado: 2008-09-09  uso: E   
[  absoluta ] (1)  Juan Carlos Petela (jcpetela) <juanca@petela.org>
[  revocada ] (2)  Juan Carlos Petela (jcpetela) <juanca@gmail.com>

Orden> deluid 
¿Borrar realmente este identificador de usuario? (s/N) s


pub  1024D/0D34DB33F  creado: 2008-09-09  uso: SC  
                     confianza: absoluta      validez: absoluta
sub  2048g/012304CD  creado: 2008-09-09  uso: E   
[  absoluta ] (1)  Juan Carlos Petela (jcpetela) <juanca@petela.org>

Buscando e Importando llaves públicas ajenas

Digamos que un amigo exportó su llave pública y nos la envió en un archivo con el nombre rolopuente.asc.

gpg --import rolopuente.asc

Pero en el caso de que nuestro buen amigo Rolo Puente no tuviera tiempo de enviarnos su llave en un archivo para simplificarnos la vida, podemos buscarla y bajarla nosotros mismos.

Si tenemos su key-id(1234D00D), solo debemos hacer:

gpg --keyserver x-hkp://pgp.mit.edu --recv-keys 0x1234D00D 

O alternativamente, podemos buscarla en http://pgp.mit.edu y bajarla:

wget -q -O - 'http://pgp.mit.edu:11371/pks/lookup?opget&search0x1234D00D ' | gpg --import 

Si no tenemos su key-id, podemos buscarla, averiguar cual es su key-id actual para no utilizar cualquier llave y repetir estos pasos.

Para buscarla debemos ejecutar:

gpg --keyserver subkeys.pgp.net --search-keys rolo@puente.com.ar

Lo cual nos devolvería algo similar a:

gpg: buscando "rolo@puente.com.ar" de hkp servidor subkeys.pgp.net
(1)     Rolo Puente <rolo@puente.com.ar>
          1024 bit DSA key 0x1234D00D, creado: 2008-07-24
(1)     Rolo Puente <rolo@puente.com.ar>
          1024 bit DSA key 0x1534F00D, creado: 2007-04-22
Keys 1-2 of 2 for "rolo@puente.com.ar".  Introduzca número(s), O)tro, o F)in >

Donde podemos ver que existe mas de una llave, quizas utilice ambas, quizas una haya dejado de utilizarla, por eso es conveniente averiguar cual es antes de continuar.

Cifrando archivos

Si queremos cifrar archivos que contienen información sensible, podemos hacerlo de la siguiente manera:

Nota: para poder enviar archivos cifrados, previamente debemos importar la llave pública del destinatario. No es realmente necesario haber firmado su llave pública.

Solo cifrar:

gpg -o archivo_cifrado.gpg --encrypt -r rolo@puente.com.ar claves_de_root_de_la_nasa.txt

Solo firmar:

gpg -o archivo_cifrado.gpg --sign -r rolo@puente.com.ar claves_de_root_de_la_nasa.txt

Firmar y cifrar:

gpg -o archivo_cifrado.gpg --encrypt  --sign -r rolo@puente.com.ar claves_de_root_de_la_nasa.txt

Estos metodos de cifrado/firmado generaran archivos binarios, para generar archivos ASCII (texto plano), debemos agregar la opcion --clearsign

Luego para decifrar estos archivos, podemos hacerlo de la siguiente manera:

gpg --decrypt archivo_cifrado.gpg

Firmando llaves

Antes que nada, es muy importante conocer a la persona que le firmemos la llave. Incluso conociendola desde hace años, lo correcto seria verificar que esta persona es realmente quien dice ser comprobandolo con el DNI/Pasaporte/Indetificación de algun tipo que sea realmente válido (Credenciales del club, tarjetas de subte, personalmente no las considero realmente validas). En algunos casos, algunas personas requieren dos (2) identificadores.

Mas información http://www.gnupg.org/howtos/es/gpg-party.html%7Caca

Habiendo hecho la introducción, veamos como firmar llaves públicas ajenas:

gpg --sign-key 0x1234D00D

O cualquier otro key-id que queramos firmar.

Para que esta firma este disponible en los servidores debemos ejecutar:

gpg --keyserver x-hkp://pgp.mit.edu --send-keys 0x1234D00D

Aunque generalmente en las fiestas de firmas de llaves, se suele enviar la llave exportada por e-mail:

gpg --armor --export 0x1234D00D | mail -s "Firme tu llave" rolo@puente.com.ar

Luego Rolo para publicar esta firma, deberia importar el archivo con nuestra firma en su llave y enviarlo a algun servidor de llaves pgp/gpg:

gpg --import llave_firmada.asc
gpg --keyserver subkeys.pgp.net --send-key 1234D00D 

Otras aplicaciones para utilizar con GPG