Software de encriptación en Linux: GPG
GPG (GNU Privacy Guard, gnupg.org, paquete gnupg) es un software de encriptación utilizado para cifrar y firmar documentos digitales, especialmente el correo, que utiliza criptografía híbrida: combina criptografía simétrica (por su rapidez), con criptografía asimétrica (por no necesitar compartir claves secretas). Sigue el estándar OpenPGP del IETF (Internet Engineering Task Force) y está integrado en numerosos programas como Secure-APT, Kmail, Evolution, Mozilla-Thunderbird, etc.
Equivalencias en Windows: PGP.
Recursos
- Manual GPG - GNU: gnupg.org/gph/es/
- GPG miniCOMO: es.tldp.org/COMO-INSFLUG/COMOs/GPG-Mini-Como/
Cómo funciona GPG
- Necesitaremos un par de claves pública/privada. Para generarlas haremos:
$ gpg --gen-key
La primera vez que lo ejecutemos creará el directorio ~/.gnupg y los archivos:
- ~/.gnupg/gpg.conf: archivo de configuración de GPG.
- ~/.gnupg/pubring.gpg (binario): archivo de claves públicas (anillo).
- ~/.gnupg/secring.gpg (binario): archivo de claves privadas (anillo).
- ~/.gnupg/trustdb.gpg (binario): base de datos de confianza.
A continuación tendremos que responder a una serie de preguntas:
- Tipo de clave
Por favor seleccione tipo de clave deseado: (1) DSA y ElGamal (por defecto) (2) DSA (sólo firmar) (5) RSA (sólo firmar) Su elección:
Seleccionamos el tipo de clave por defecto, 1.
- Longitud de la clave
El par de claves DSA tendrá 1024 bits Las claves ELG-E pueden tener entre 1024 y 4096 bits de longitud ¿De qué tamaño quiere la clave? (2048)
Seleccionamos la longitud por defecto, 2048.
- Caducidad
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)?
Seleccionamos un año: 1y.
- Identificador de usuario
Necesita un identificador de usuario para identificar su clave. El programa construye el identificador a partir del Nombre, Comentario y email de esta forma: "Heinrich Heine (Der Dichter) <[email protected]>" Nombre y apellidos: frans berns Email: [email protected] Comentario: francis Ha seleccionado este ID de usuario: "frans berns (francis) <[email protected]>" ¿Cambiar (N)ombre, (C)omentario, (D)irección, (V)ale o (S)alir?
Si está bien pulsamos (V)ale y continuamos.
- Passphrase
Necesita una Frase contraseña para proteger su clave privada Introduzca Frase contraseña: Repita Frase contraseña:
Una vez introducidos todos los datos, generará el par de claves. Durante este proceso GPG recoge datos aleatorios que usará para generar las claves:
++++++++++++++++++ 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. ++++++++++++++++++
Cuando termine nos mostrará el mensaje final:
~/.gnupg/trustdb.gpg: se ha creado base de datos de confianza. Clave ED4B2ABA marcada como de confianza absoluta. Claves pública y secreta creadas y firmadas. Comprobando base de datos de confianza: 3 dudosas necesarias, 1 completa necesaria. Modelo de confianza PGP: Nivel: 0 Validez: 1 Firmada: 0 Confianza: 0-, 0q, 0n, 0m, 0f, 1u Siguiente comprobación de base de datos de confianza el 2007-04-09 pub 1024D/ED4B2ABA 2006-04-09 [caduca: 2007-04-09] Huella de clave: C8F1 06C9 27C9 C2D1 2205 95F3 14BB 1129 ED4B 2ABA uid frans berns (francis) <[email protected]> sub 2048g/D223B5B2 2006-04-09 [caduca: 2007-04-09]
- Para comprobar si se han generado las claves, las listamos:
- listamos las claves públicas (de momento sólo está la nuestra):
$ gpg --list-keys /home/francis/.gnupg/pubring.gpg -------------------------------- pub 1024D/ED4B2ABA 2006-04-09 [caduca: 2007-04-09] uid frans berns (francis) <[email protected]> sub 2048g/D223B5B2 2006-04-09 [caduca: 2007-04-09]
El UID lo utilizaremos cuando tengamos que seleccionar una clave. El UID de nuestra clave es ED4B2ABA.
- listamos las claves privadas:
$ gpg --list-secret-keys /home/francis/.gnupg/secring.gpg -------------------------------- sec 1024D/ED4B2ABA 2006-04-09 [caduca: 2007-04-09] uid frans berns (francis) <[email protected]> ssb 2048g/D223B5B2 2006-04-09
- listamos las claves públicas (de momento sólo está la nuestra):
- Para conocer el fingerprint de la clave cuyo UID es ED4B2ABA, haremos (si no especificamos
el UID obtendremos los fingerprint de todas las claves):
$ gpg --fingerprint ED4B2ABA Huella de clave: C8F1 06C9 27C9 C2D1 2205 95F3 14BB 1129 ED4B 2ABA
Vemos que el UID de una clave son los últimos 8 caracteres de su fingerprint. El fingerprint lo utilizaremos para comprobar las claves que recibamos antes de certificarlas, y con nuestra clave para dárselo en mano o por teléfono a otros usuarios.
- Podemos editar los parámetros de una clave con el comando:
$ gpg --edit-key ED4B2ABA
Entraremos en modo interactivo, donde disponemos de numerosos comandos. Por ejemplo, para modificar la fecha de caducidad ejecutaremos el comando:
Command> expire
Nos pedirá la passphrase y guardaremos los cambios con:
Command> save
- La clave pública tenemos que distribuirla. Podemos hacerlo de varias maneras:
- para exportar nuestra clave pública a un archivo que posteriormente
podemos enviar por correo, haremos:
$ gpg -a --export ED4B2ABA > <archivo>.gpg
La opción -a genera un archivo ASCCI.
- para enviar nuestra clave pública a un repositorio de claves, primero editaremos
el archivo ~/.gnupg/gpg.conf y descomentaremos la línea correspondiente
a ese servidor, en este caso RedIRIS:
keyserver pgp.rediris.es
Para enviar nuestra clave pública, cuyo UID es ED4B2ABA, al servidor RedIRIS, haremos:
$ gpg --send-keys ED4B2ABA
Podemos añadir más servidores de claves en ~/.gnupg/gpg.conf, por ejemplo el MIT:
keyserver pgpkeys.mit.edu
Para conectar con un servidor específico usaremos la opción --keyserver, por ejemplo:
$ gpg --keyserver pgpkeys.mit.edu --send-keys ED4B2ABA
- para exportar nuestra clave pública a un archivo que posteriormente
podemos enviar por correo, haremos:
- Si hemos enviado nuestra clave a un repositorio, podemos revocar la clave
mediante un certificado de revocación. Cuando creamos una clave
es muy recomendable crear el certificado de revocación: puede ocurrir que
perdamos la passphrase y no podamos utilizar la clave privada: en ese caso
tendremos que revocar la clave, pero no podremos hacerlo por no disponer de
la passphrase. Para crear el certificado de revocación de la clave
cuyo UID es ED4B2ABA, haremos:
$ gpg -a -o cert_revoc.asc --gen-revoke ED4B2ABA ¿Crear un certificado de revocación para esta clave? (s/N)
Nos preguntará porqué revocamos la clave.
Elija una razón para la revocación: 0 = No se dio ninguna razón 1 = La clave ha sido comprometida 2 = La clave ha sido reemplazada 3 = La clave ya no está en uso Q = Cancelar
Elegiremos 3 = La clave ya no está en uso.
Nos pedirá un comentario opcional. Pondremos:
Certificado por si pierdo la passphrase
Por último tendremos que introducir la passphrase. El mensaje final es:
Certificado de revocación creado. Cuidado: si alguien consigue este certificado puede inutilizar su clave. Es inteligente imprimir este certificado por si acaso lo pierde.
Se habrá generado el archivo ~/.gnupg/cert_revoc.asc (la opción -a genera un archivo ASCCI).
Si más adelante necesitamos revocar la clave, añadiremos a nuestro listado de claves el certificado de revocación:
$ gpg --import cert_revoc.asc
y luego enviaremos al servidor la clave revocada:
$ gpg --send-keys ED4B2ABA
- Podemos borrar claves:
- para borrar la clave pública cuyo UID es aa8e6a57, haremos:
$ gpg --delete-key aa8e6a57
- para borrar la clave privada cuyo UID es ED4B2ABA, haremos:
$ gpg --delete-secret-key ED4B2ABA
- para borrar la clave pública cuyo UID es aa8e6a57, haremos:
- Cuando se recibe una clave pública de otro usuario tenemos que añadirla
a la base de datos de claves públicas (anillo de claves públicas).
Podemos hacerlo de varias maneras:
- si hemos recibido de ese usuario un archivo con su clave pública, haremos:
$ gpg --import <archivo>
- si queremos bajarnos de un repositorio la clave pública de alguien, necesitamos su UID. Si
tenemos su fingerprint, los últimos 8 caracteres son el UID. Para comprobar si el servidor
dispone de la clave cuyo UID es aa8e6a57, haremos:
$ gpg --search-key aa8e6a57
Para bajarnos la clave cuyo UID es aa8e6a57, haremos:
$ gpg --recv-keys aa8e6a57
Para conectarnos a un servidor específico usaremos la opción --keyserver, por ejemplo:
$ gpg --keyserver pgpkeys.mit.edu --recv-keys aa8e6a57
- si hemos recibido de ese usuario un archivo con su clave pública, haremos:
- Para poder utilizarlas claves públicas de otros usuarios debemos
decirle a GPG que son válidas, cosa que podemos hacer de dos maneras:
- las claves públicas van acompañadas de un listado de
certificados X509,
el primero de los cuales es del propietario de la clave. Cada certificado está emitido
por un certificador, que es un usuario
que ha considerado válida esa clave pública. Yo tendré una base de datos
de certificadores y a cada uno le asignaré un nivel de confianza: Nula,
Total o No lo conozco. Cuando yo reciba una clave pública y a alguno de
sus certificadores yo lo tenga catalogado con un nivel de confianza Total,
automáticamente GPG considerará esa clave válida. De lo contrario, no
será válida y no podré usarla, ya que no será de fiar, a no ser que yo
mismo confirme su validez.
Cualquier usuario puede certificar una clave, pero existen instituciones que se dedican expresamente a la tarea de certificar claves públicas: son las llamadas Autoridades Certificadoras (CA, Certificate Authority), como VeriSign, OpenCA, EnTrust, etc.
- confirmo yo su validez. Si la clave pública recibida no viene firmada
por ningún certificador de confianza total, para usarla tendré que darle
yo validez. Previamente tendré que obtener el fingerprint por un medio alternativo
y seguro (por ejemplo, por teléfono) y comprobar si el fingerprint de dicha
clave pública corresponde realmente al remitente. Certificar una clave pública
sin verificarla adecuadamente implica asumir el riesgo de una posible suplantación.
De esa manera, mi nombre se añadirá al listado de certificadores que acompaña
a la clave. En ese caso, tengo la opción de reenviar la clave con mi firma
a su dueño para que disponga de ella.
Por ejemplo, si quiero enviar un documento cifrado a alguien y su clave pública no está certificada, la certificaré yo haciendo:
$ gpg --sign-key aa8e6a57
o bien:
$ gpg --edit-key aa8e6a57
Entraremos en modo interactivo, y ejecutaremos la orden:
Command> sign
Nos pedirá la passphrase, confirmaremos que queremos certificar la clave y guardaremos los cambios:
Command> save
Previamente tengo que asegurarme de que esa clave es suya.
Si he certificado la clave, puedo enviarla al servidor de claves incluyendo ese certificado:
$ gpg --send-keys aa8e6a57
Si no estoy seguro de que la clave sea suya pero de todos modos quiero utilizarla para cifrar un documento, lo que hare será certificar su clave (así podré usarla) pero de manera que mi certificado no se exporte a los servidores, haciendo:
$ gpg --edit-key aa8e6a57
En vez de:
Command> sign
pondremos:
Command> lsign
Esto significa que nuestro certificado es local y no se exportará. Confirmaremos que queremos certificar la clave y guardaremos los cambios.
- las claves públicas van acompañadas de un listado de
certificados X509,
el primero de los cuales es del propietario de la clave. Cada certificado está emitido
por un certificador, que es un usuario
que ha considerado válida esa clave pública. Yo tendré una base de datos
de certificadores y a cada uno le asignaré un nivel de confianza: Nula,
Total o No lo conozco. Cuando yo reciba una clave pública y a alguno de
sus certificadores yo lo tenga catalogado con un nivel de confianza Total,
automáticamente GPG considerará esa clave válida. De lo contrario, no
será válida y no podré usarla, ya que no será de fiar, a no ser que yo
mismo confirme su validez.
- Para facilitar el uso de la tecnología de claves públicas, se ha desarrollado una
Infraestructura de clave pública
(PKI, Public Key Infrastructure), que consta de:
- repositorios de claves públicas: se encargan de almacenar claves
públicas para facilitar a los usuarios el intercambio de las mismas. No garantizan
que la claves sean válidas: para eso están los certificados incorporados a
las propias claves.
Existen servidores de claves públicas repartidos por todo el mundo, como por ejemplo el de RedIRIS (rediris.es/cert/servicios/keyserver/). Es suficiente enviar la clave pública a un servidor: la información que mandemos se distribuirá rápidamente por otros servidores de claves, y ya no podremos borrar esos datos, sólo revocar la clave si tenemos el certificado de revocación.
- autoridades certificadoras: se encargan de emitir, revocar y validar certificados. Es la entidad de confianza que da legitimidad a una clave pública.
- repositorios de claves públicas: se encargan de almacenar claves
públicas para facilitar a los usuarios el intercambio de las mismas. No garantizan
que la claves sean válidas: para eso están los certificados incorporados a
las propias claves.
- Para ver los certificados de las claves públicas que tenemos, haremos:
$ gpg --list-sigs /home/francis/.gnupg/pubring.gpg -------------------------------- pub 1024D/ED4B2ABA 2006-04-09 [caduca: 2007-04-09] uid frans berns(francis)<[email protected]> sub 2048g/D223B5B2 2006-04-09 [caduca: 2007-04-09] sig ED4B2ABA 2006-04-09 frans berns(francis)<[email protected]>
Vemos que sólo tiene nuestro certificado.
- Para cifrar, GPG usa cifrado híbrido: utiliza la clave pública de un usuario,
y sólo ese usuario podrá descrifrarlo utilizando su clave privada.
- Para cifrar un archivo, la sintaxis es:
$ gpg -a -o <archivo_cifrado> -r <UID> -e <archivo>
- -o <archivo_cifrado>: archivo cifrado.
- -r <UID>: indica el UID del destinatario, y por tanto, el único que podrá descifrar el mensaje usando de su clave privada.
- -e <archivo>: archivo que va a ser cifrado.
- -a: genera un archivo ASCCI.
Por ejemplo, para cifrar el archivo /etc/hostame con nuestra clave pública (para que sólo nosotros podamos descrifrarlo, con nuestra clave privada) y generar el archivo cifrado hostame_cifrado (texto), haremos:
$ gpg -a -o hostame_cifrado -r ED4B2ABA -e /etc/hostame
- Para descifrar un archivo, sólo podremos hacerlo si ha sido cifrado
con nuestra clave pública. La sintaxis es:
$ gpg -o <archivo> -d <archivo_cifrado>
- -o <archivo>: archivo descifrado.
- -d <archivo_cifrado>: archivo que va a ser descifrado.
Por ejemplo, para descifrar el archivo hostame_cifrado y generar el archivo descifrado hostame_new, haremos:
$ gpg -o hostame_new -d hostame_cifrado Necesito la passphrase del usuario: frans berns (francis) <[email protected]> para la clave primaria ED4B2ABA, creada el 2006-04-09
Introducimos la passphrase que protege la clave privada y descifrará el archivo, que es idéntico al original /etc/hostame.
- Para cifrar un archivo, la sintaxis es:
- Para firmar, GPG usa cifrado híbrido.
- Para firmar un archivo con nuestra clave, la sintaxis es:
$ gpg -r <UID> --sign <archivo>
- -u <UID>: cuando tenemos varias claves privadas tenemos que seleccionar cuál se va a utilizar para firmar el documento.
Nos pedirá la passphrase y generará un archivo comprimido (binario) que incluye la firma. Por ejemplo, si hacemos:
$ gpg --sign hostame_new
obtenemos hostame_new.gpg, un archivo comprimido (binario) que incluye la firma.
- Para firmar un archivo con nuestra clave, pero sin comprimir, la sintaxis es:
$ gpg --clearsign <archivo>
Nos pedirá la passphrase y generará un archivo de texto que incluye la firma. Por ejemplo, si hacemos:
$ gpg --clearsign hostame_new
obtenemos hostame_new.asc, un archivo de texto que incluye la firma.
- Si queremos firmar un archivo con nuestra clave, y que la firma vaya en
un fichero binario aparte, haremos:
$ gpg --detach-sign <archivo>
Nos pedirá la passphrase y generará un archivo binario que contiene sólo la firma. Esto se utiliza normalmente para firmar archivos binarios o comprimidos. Por ejemplo, si hacemos:
$ gpg --detach-sign hostame_new
obtenemos hostame_new.sig, un archivo binario que contiene sólo la firma.
Para que el archivo que contiene la firma sea un archivo de texto, incluiremos la opción -a. Por ejemplo, si hacemos:
$ gpg -a --detach-sign hostame_new
obtenemos hostame_new.asc, un archivo de texto que contiene sólo la firma.
- Para verificar la firma que acompaña un documento, haremos:
$ gpg --verify <archivo>
- Para firmar un archivo con nuestra clave, la sintaxis es:
- Una vez que se tiene el sistema funcionando necesita ser mantenido:
- para mantener actualizados los niveles de confianza, haremos:
$ gpg --refresh-keys
- para actualizar las claves del servidor, por si alguién añade un certificado
a una clave y lo envía al servidor, haremos:
$ gpg --check-trustdb
- para mantener actualizados los niveles de confianza, haremos:
- Existen diversos frontales para gestionar GPG y los certificados:
2 Comentarios en “Software de encriptación en Linux: GPG”
Deja un comentario
Felicitaciones por el tutorial. Excelente. Tengo la siguiente pregunta cuando se refieren a “las claves públicas van acompañadas de un listado de certificados X509, el primero de los cuales es del propietario de la clave. Cada certificado está emitido por un certificador, que es un usuario que ha considerado válida esa clave pública. Yo tendré una base de datos de certificadores y a cada uno le asignaré un nivel de confianza: Nula, Total o No lo conozco”
¿Como puedo saber que certificadores tengo y en que nivel de confianza estan? ¿como conozco la base de datos?
Muchas Gracias. (Utlizo GnuPG)
quiero agregar un archivo .jpg a mi llave publica cual es el codigo para hacer esto
saludos