← retour aux snippets

git: signer les commits avec ssh

Activer la signature SSH des commits et tags, vérifier localement et sur git.data.pm.


objectif

Signer automatiquement vos commits et tags avec une clé SSH (ed25519), puis vérifier les signatures localement et sur une forge (ex: git.data.pm).

code minimal

# activer la signature SSH globale
git config --global gpg.format ssh
git config --global user.signingKey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true

utilisation

# 1) si besoin, générer une clé (ed25519) identifiée
ssh-keygen -t ed25519 -a 100 -C "dev@data.pm" -f ~/.ssh/id_ed25519

# 2) activer la signature SSH et la clé publique comme clé de signature
git config --global gpg.format ssh
git config --global user.signingKey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true

# 3) signer un commit (automatique grâce à commit.gpgsign)
git commit -m "feat: activer la signature SSH"

# 4) vérifier une signature de commit
git log --show-signature -1

# 5) signer un tag annoté et vérifier
git tag -s v1.2.3 -m "v1.2.3"
git tag -v v1.2.3

variante(s) utile(s)

# fichier des signataires autorisés (pour vérifier les signatures des autres)
install -d -m 0700 ~/.config/git
printf 'dev@data.pm %s\n' "$(cat ~/.ssh/id_ed25519.pub)" > ~/.config/git/allowed_signers
chmod 0600 ~/.config/git/allowed_signers
git config --global gpg.ssh.allowedSignersFile ~/.config/git/allowed_signers

# ajouter plusieurs signataires (ex: CI et devs)
{
  printf 'ci@data.pm %s\n'   "$(cat /etc/ci/ssh_ci_ed25519.pub 2>/dev/null || true)"
  printf 'alice@data.pm %s\n' "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...alice"
  printf 'bob@data.pm %s\n'   "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...bob"
} >> ~/.config/git/allowed_signers

# forcer la signature dans un repo spécifique (sans touche globale)
git config gpg.format ssh
git config user.signingKey ~/.ssh/id_ed25519.pub
git config commit.gpgsign true

# verifier toutes les signatures d'un range de commits
git log --show-signature origin/main..HEAD

# changer de clé (rotation)
git config --global user.signingKey ~/.ssh/id_ed25519_rotated.pub

notes

  • nécessite Git ≥ 2.34 pour gpg.format ssh. La clé publique (~/.ssh/id_ed25519.pub) sert d’identifiant.
  • commit.gpgsign=true signe tous les commits; désactivez ponctuellement avec --no-gpg-sign.
  • allowedSignersFile mappe des “principals” (ex: emails dev@data.pm) à des clés publiques; Git l’utilise pour vérifier.
  • publiez la clé publique dans votre compte forge (ex: git.data.pm) pour obtenir l’icône “verified” côté serveur.