A continuación se muestra el paso a paso para crear una llave GPG y posteriormente firmar digitalmente tus commits en GitHub.
Introducción a GPG
Antes de ir al paso a paso, GPG es una herramienta de cifrado para crear firmas digitales. Permite cifrar mensajes con el uso de pares de llaves asímetricas (llave pública y privada). En el cifrado asimétrico, básicamente compartes tu llave pública a las personas o aplicaciones que quieres que verifiquen la autenticidad de los mensajes que enviaras firmado usando tu llave privada.
<h3>1. Instalación de GPG:</h3>Primero verificamos que nuestro software de GPG este instalado:
which gpg
Si no existe, procedemos a instalarlo con el siguiente comando:
sudo apt-get install gnupg
Para ver instrucciones de cómo instalarlo en otros sistemas operativos sigue este link.
<h3>2. Generamos llaves GPG del tipo RSA</h3>Con nuestro software GPG instalado procedemos a generar nuestras llaves:
gpg --gen-key
Se nos desplegara un menú de opciones via consola, y a continuación mostramos el paso a paso a seguir. Recomiendo usar una llave de tamaño 4096 bits para mayor seguridad:
gpg (GnuPG) 1.4.20; Copyright (C) 2015 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? (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) 1y
Key expires at Sun Jun 14 12:17:54 2020 -05
Is this correct? (y/N) y
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
Real name: Heinrich Heine
Email address: heinrichh@duesseldorf.de
Comment: Der Dichter
You selected this USER-ID:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.
Se tardará un poco la generación de nuestra llave y se nos pedirá que hagamos operaciones de lectura y escritura en disco para generar mayor entropia:
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.
......+++++
Not enough random bytes available. Please do some other work to give
the OS a chance to collect more entropy! (Need 114 more bytes)
.............+++++
gpg: key 7110CE00 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: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2020-06-14
pub 2048R/3423CE33 2019-06-15 [expires: 2020-06-14]
Key fingerprint = 432B A5B0 5423 5467 CE00 3333 FCE2 7F45 593F 7110
uid Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>
sub 2048R/43564534 2019-06-15 [expires: 2020-06-14]
<h3>3. Problemas en la generación de sus llaves GPG?</h3>
La primera vez es posible que obtengan el siguiente error:
..+++++
.+++++
gpg: no writable public keyring found: eof
Key generation failed: eof
El error anterior es de permisos y se soluciona dando acceso al usuario y grupo de nuestro sistema a la carpeta ~/.gpupg
. Posteriormente podemos repetir los pasos anteriores para generar las llaves con éxito.
sudo chown -R myuser:myuser ~/.gnupg
<h4>4. Obteniendo nuestra llave pública</h4>
Necesitaremos la llave pública para compartirlo con las personas o aplicaciones que queremos que verifiquen la autenticidad de nuestros mensajes.
gpg --list-keys
Salida de ejemplo:
/home/myuser/.gnupg/pubring.gpg
-----------------------------------
pub 2048R/PUBKEYXX 2019-06-15 [expires: 2020-06-14]
uid Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>
sub 2048R/233XXXXX 2019-06-15 [expires: 2020-06-14]
Usando la llave PUBKEYXX
que se muestra en la salida del ejemplo anterior podremos imprimir nuestras llaves en consola:
gpg --armor --export PUBKEYXX
Salida de ejemplo:
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1
6IEdhbGVhbm8gKEdQRyBLZXkgZm9yIFhlcmdpb0FsZVggRGV2T3Bzbyb5laXguDf
6IEdhbGVhbm8gKEdQRyBLZXkgZm9yIFhlcmdpb0FsZVggRGV2T3Bzbyb5laXguDf
6IEdhbGVhbm8gKEdQRyBLZXkgZm9yIFhlcmdpb0FsZVggRGV2T3Bzbyb5laXguDf
...
6IEdhbGVhbm8gKEdQRyBLZXkgZm9yIFhlcmdpb0FsZVggRGV2T3Bzbyb5laXguDf
6IEdhbGVhbm8gKEdQRyBLZXkgZm9yIFhlcmdpb0FsZVggRGV2T3Bzbyb5laXguDf
6IEdhbGVhbm8gKEdQRyBLZXkgZm9yIFhlcmdpb0FsZVggRGV2T3Bzbyb5laXguDf
9w==
=qtS2
-----END PGP PUBLIC KEY BLOCK-----
<h4>5. Guardando llaves GPG Key en GitHub && GitLab</h4>
Para nuestro ejemplo queremos firmar nuestros commits en GitHub y GitLab:
En GitHub:
- Ve al area de configuración en GitHub, entonces da click en la opción
SSH and GPG keys
ubicada en el menú lateral. Finalmente agrega tu llave pública usando el botón New GPG key.
En GitLab:
- Ve al area de configuración en GitLab, entonces da click en la opción
GPG Keys
ubicada en el menú lateral. Pega tu llave pública en el area de texto y finalmente da click en el botónAdd Key
para agregarla.
Si has llegado hasta aquí finalmente podras firmar digitalmente tus commits en github usando la opción -S
como sigue:
git commit -S -am "signed commit"
Obtendras un label de verificación en cada commit firmado con tu llave:
En GitHub:
En GitLab:
Si les gusto siganme en mis redes 😃, me encuentran cómo @XergioAleX
Curso de DevOps con GitLab