12.3.2019
Vamos a utilizar PGP/GnuPG para firmar y autenticar ficheros. En esta primera parte nos vamos a enfocar en los conceptos básicos, instalación, firma y verificación de documentos.
Tal cómo hay ocasiones donde queremos mantener el anonimato en Internet, hay otras en las cuales queremos que se nos reconozca inequívocamente. Y la mejor manera que tenemos es utilizando la infraestructura de llaves públicas para firmar digitalmente lo que queramos. Algo habíamos tratado en el post de túneles SSH y la generación de sus certificados. En el artículo de hoy vamos a tratar con GnuPG, su instalación y su uso para generar el par de claves criptográficas para luego poder firmar archivos, y más adelante, correos electrónicos y commits en Git/GitHub. Vamos a utilizar la terminal para ingresar todos los comandos, ya que es igual en todos los sistemas operativos.
GNU Privacy Guard.
Ese el nombre nombre y apellido de GnuPG, y que de ahora en más nos referiremos directamente como GPG
. GPG
es una implementación completa y libre del estándar OpenPGP, que define los formatos para la encriptación, firmas, certificados e intercambios de llaves públicas. Si bien hoy no vamos a entrar en todos los conceptos técnicos, dejamos un par puntos que hay que saber:
- Cifrado asimétrico.
- A muy grosso modo es que si firmamos / encriptamos un archivo con una llave (pública o privada), unicamente puede ser verificado / desencriptado con la llave complementaria.
- Anillos de claves (
keyring
).- El
keyring
es el deposito donde se almacenan todas las claves GPG, tanto públicas como privadas. Cada vez que tengamos que hacer alguna operación vamos a necesitar acceder a este almacén para recuperar el key especifico.
- El
- Servidores de claves (
keyservers
).- Son servidores donde se almacenan las llaves públicas para ser utilizadas por terceros y así puedan verificar nuestra identidad o desencriptar nuestros mensajes.
Instalar GPG.
En Linux, Ubuntu y Debian particularmente ya viene preinstalado. Por cualquier cosa se puede instalar con
sudo apt install gpg
En MacOS se instala mediante la GPG Suite que tiene todas las herramientas necesarias para firmar y encriptar todo. También se puede puede instalar con 🍺 brew
brew install gpg
GPG
en Windows tiene también una aplicación intuitiva llamada Gpg4win, que al igual que en MacOS con un par de clicks instala todo lo necesario.
Generación de claves GPG.
Ahora vamos a generar el par de llaves criptográficas. Para esto ejecutarmos una nueva terminal (cmd o PowerShell en Windows) e ingresamos el comando gpg --full-generate-key
gpg --full-generate-key
gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 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)
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: Tu Nombre
Email address: usuario@tu_dominio.com
Comment: Claves de prueba
You selected this USER-ID:
"Tu Nombre (Claves de prueba) <usuario@tu_dominio.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key DC3D837355BE3287 marked as ultimately trusted
gpg: directory '/home/logico/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/logico/.gnupg/openpgp-revocs.d/DC6A3A2134D6F946616F8229DC3D837355BE3287.rev'
public and secret key created and signed.
pub rsa4096 2019-04-08 [SC]
DC6A3A2134D6F946616F8229DC3D837355BE3287
uid Tu Nombre (Claves de prueba) <usuario@tu_dominio.com>
sub rsa4096 2019-04-08 [E]
Si queremos ver las claves que tenemos almacenadas en el keyring
ejecutamos el comando gpg --list-secret-keys --keyid-format LONG
gpg --list-secret-keys --keyid-format LONG
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 3 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 3u
/home/logico/.gnupg/pubring.kbx
-------------------------------
sec rsa4096/DC3D837355BE3287 2019-04-08 [SC]
DC6A3A2134D6F946616F8229DC3D837355BE3287
uid [ultimate] Tu Nombre (Claves de prueba) <usuario@tu_dominio.com>
ssb rsa4096/578F47EC107E3D87 2019-04-08 [E]
Distribuir la llave pública.
Ahora bien, no es de mucha utilidad poder firmar y encriptar archivos si sólo nosotros podemos hacerlo. Y acá entra la distribución de las llaves públicas. Así que el primer paso es extraer la llave del keyring
con el comando --armor --export
y el ID o email de la llave.
gpg --armor --export DC3D837355BE3287
gpg --armor --export usuario@tu_dominio.com
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
ZpFkSe/QgsZDtsgpufOnWGg=
=y3m8
-----END PGP PUBLIC KEY BLOCK-----
Cómo podés ver, exporta la clave pública a la terminal. En cambio si lo que querés es exportarlo a un archivo entonces con
gpg --armor --export DC3D837355BE3287 > llave_publica.asc
Hecho esto podrías enviarle la llave por email, whatsapp, carta (si, podés imprimir una hoja y enviarla).
¿Pero qué hacer cuando querés compartir la llave con el mundo?. Es acá que entran los keyservers
. Uno puede publicar la clave para que cualquiera pueda descargarla y verificar que los archivos firmados por nosotros sean validos. Para publicarlo sólo tenemos que ingresar el comando
gpg --keyserver search.keyserver.net --send-key DC3D837355BE3287
gpg --keyserver search.keyserver.net --send-key usuario@tu_dominio.com
Además de la linea de comandos también podés cargarlo desde la interfaz web que cada uno de los servidores posee. Acá dejamos una lista de los servidores más conocidos
- http://www.keyserver.net/
- http://keys.gnupg.net/
- https://pgp.mit.edu/
- https://keyserver.pgp.com/
- https://keybase.io/
Firmar archivos con GPG.
Llegamos a la parte final de esta guía. Acá cuando vamos a firmar nuestros archivos para que el destinatario pueda verificar que el archivo es nuestro y no ha sido modificado.
Si sólo tenes una llave generada podes firmar el archivo.txt
con el comando
gpg --output firma.sig --detach-sig archivo.txt
En cambio, si en el keyring
hay varias claves podes especificar con cual se va a firmar el documento con el parametro --local-user [id o mail]
gpg --local-user DC3D837355BE3287 --output firma.sig --detach-sig archivo.txt
gpg --local-user usuario@tu_dominio.com --output firma.sig --detach-sig archivo.txt
Cómo se puede ver, se creo un archivo nuevo llamado firma.sig
, y ese archivo es precisamente la firma digital del fichero. Lo que nos lleva a...
Verificar archivos firmados con GPG.
Lo que tenemos que hacer es enviar tanto el fichero archivo.txt
y la firma firma.sig
al destinatario. Luego, para verificar la integridad en el destino ejecutar:
gpg --verify firma.sig archivo.txt
Si todo va bien, se mostrará el mensaje de Good signature
. Y eso es todo por hoy, en el próximo artículo veremos como firmar emails con Thunderbird, GPP y Enigmail.