Por qué firmar
Un commit firmado atestigua criptográficamente "este commit fue autorizado por el poseedor de esta llave, sin cambios desde la firma." Las firmas defienden contra suplantación y manipulación, y plataformas como GitHub muestran un badge "Verified" cuando la firma coincide con una llave configurada.
Configuración inicial
gpg --full-generate-key # elegir RSA 4096 o Ed25519
gpg --list-secret-keys --keyid-format=long
git config --global user.signingkey 0xABCDEF1234567890
git config --global commit.gpgsign true
git config --global tag.gpgsign true
Exporta la llave pública y añádela a GitHub/GitLab/Gitea:
gpg --armor --export 0xABCDEF1234567890
Firmar bajo demanda
git commit -S -m "Cambio importante"
git tag -s v1.0.0 -m "Release 1.0.0"
Verifica un commit individual o todas las entradas:
git log --show-signature
git verify-commit <sha>
git verify-tag v1.0.0
GPG agent y pinentry
# ~/.gnupg/gpg-agent.conf
default-cache-ttl 28800
max-cache-ttl 86400
pinentry-program /usr/local/bin/pinentry-mac
Llaves hardware
YubiKey o tokens similares pueden albergar la llave de firma GPG, requiriendo un toque por commit.
WSL y SSH
Si firmas desde WSL o sobre SSH, configura el agent forwarding correctamente. Establece GPG_TTY=$(tty) en la inicialización de tu shell.
Errores comunes
Establecer commit.gpgsign true sin un agent funcional hace que cada git commit se cuelgue. Olvidar publicar tu llave pública en la plataforma deja badges "Unverified". Las llaves caducan; calendariza un recordatorio.
Verificar un push remoto
git push --signed