5

Firmando digitalmente commits en GitHub y GitLab usando llaves GPG

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 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:

  • 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ón Add Key para agregarla.
<h4>6. Firmando commits en github</h4>

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:
gpg_signed_github_commit.png

En GitLab:
gpg_signed_gitlab_commit.png

Si les gusto siganme en mis redes 😃, me encuentran cómo @XergioAleX

Escribe tu comentario
+ 2
1
1159Puntos

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.