A continuación se muestra el paso a paso para crear una llave GPG y posteriormente firmar digitalmente tus commits en GitHub.
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 ofkey 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 1024and4096 bits long.
What keysize do you want? (2048)
Requested keysize is2048 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
Keyis valid for? (0) 1y
Key expires at Sun Jun 1412:17:542020-05Is 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) <[email protected]>"
Real name: Heinrich Heine
Email address: [email protected]
Comment: Der Dichter
You selected this USER-ID:
"Heinrich Heine (Der Dichter) <[email protected]>"
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 ofrandombytes. It is a good idea to perform
some other action (type onthekeyboard, movethemouse, utilizethe
disks) during the prime generation; this gives therandomnumber
generator a better chance to gain enough entropy.
......+++++
Not enough randombytes 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 at2020-06-14
pub 2048R/3423CE33 2019-06-15 [expires: 2020-06-14]
Key fingerprint = 432B A5B0 54235467 CE00 3333 FCE2 7F45 593F 7110
uid Heinrich Heine (Der Dichter) <[email protected]>
sub 2048R/435645342019-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) <[email protected]>
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--exportPUBKEYXX
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:
SSH and GPG keys
ubicada en el menú lateral. Finalmente agrega tu llave pública usando el botón New GPG key.En GitLab:
GPG Keys
ubicada en el menú lateral. Pega tu llave pública en el area de texto y finalmente da click en el botón Add 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
Increíble tutorial, MUY bien explicado todo. También sería interesante que incluyeses como asignar la clave a git para que firme automáticamente todos nuestros commits.