Par Anonyme (non vérifié) , 29 avril 2026

Ce que vous accomplirez

Vous configurerez Git pour signer commits et tags en utilisant votre clé SSH existante, configurerez le fichier allowed-signers pour la vérification, et intégrerez avec GitHub ou GitLab.

Pourquoi la signature SSH

La signature SSH est arrivée dans Git 2.34. Elle réutilise la clé SSH que vous utilisez déjà pour pusher.

Étape 1 : confirmer la version Git

git --version

Étape 2 : confirmer qu'une clé SSH existe

ls -la ~/.ssh/id_ed25519*
ssh-keygen -t ed25519 -C "[email protected]"

Étape 3 : configurer Git pour signer avec SSH

git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
git config --global tag.gpgsign true

Étape 4 : tester

cd /tmp/sign-test
git init
echo "test" > file.txt
git add . && git commit -m "Test signed commit"
git log --show-signature -1

Étape 5 : configurer les signers autorisés

mkdir -p ~/.config/git
echo "[email protected] $(cat ~/.ssh/id_ed25519.pub)" \
  >> ~/.config/git/allowed_signers
git config --global gpg.ssh.allowedSignersFile ~/.config/git/allowed_signers

Étape 6 : vérifier un commit

git verify-commit HEAD
git log --show-signature
git verify-tag v1.0.0

Étape 7 : uploader la clé sur votre host Git

Étape 8 : signer des commits anciens

git commit --amend --no-edit -S
git rebase -i <base> --exec 'git commit --amend --no-edit -S'

Étape 9 : forcer les commits signés

gh api -X PUT repos/owner/repo/branches/main/protection \
  -F required_signatures.enabled=true

Étape 10 : gérer plusieurs machines

  • Clé par machine.
  • Une clé maître.
  • Clé matérielle.

Signature appuyée par le matériel

ssh-keygen -t ed25519-sk -O resident -C "[email protected]"

Étape 11 : signer les tags

git tag -s v1.0.0 -m "Release 1.0.0"
git tag -v v1.0.0

Dépannage

  • "gpg: skipped: No secret key" - GPG est encore configuré.
  • "Bad signature" sur un commit d'autrui - sa clé n'est pas dans allowed_signers.
  • Le host montre "Unverified" - clé publique non uploadée.