Aller au contenu

GitSign : signer vos commits Git avec Sigstore

Mise à jour :

Vous contribuez à un projet open source. Un jour, quelqu’un pousse un commit malveillant en utilisant votre adresse email dans git config. Sans signature, impossible de prouver que ce n’était pas vous.

GitSign résout ce problème avec la signature keyless : vous signez vos commits avec votre identité (compte GitHub, Google, Microsoft) au lieu d’une clé GPG à gérer. Le tout est enregistré dans un log de transparence public pour garantir l’auditabilité.

Qu’est-ce que GitSign ?

GitSign est un outil développé par le projet Sigstore qui permet de signer vos commits Git sans gérer de clés cryptographiques.

Comment ça fonctionne :

  1. Vous faites un commit
  2. GitSign ouvre un navigateur pour vous authentifier (GitHub, Google, etc.)
  3. Fulcio délivre un certificat éphémère (valable 10 minutes)
  4. Votre commit est signé avec ce certificat
  5. La signature est enregistrée dans Rekor, le log de transparence public

Le certificat expire rapidement, mais la signature reste vérifiable grâce à Rekor qui prouve qu’elle a été créée pendant la période de validité.

Pour comprendre en détail le fonctionnement de la signature keyless, consultez le guide Sigstore.

Pourquoi signer ses commits ?

La signature de commits répond à un problème fondamental : Git ne vérifie pas l’identité de l’auteur. N’importe qui peut configurer git config user.email avec votre adresse et pousser des commits en votre nom.

Sans signatureAvec signature
N’importe qui peut usurper votre emailIdentité vérifiée cryptographiquement
Compromission de compte → commits frauduleuxSignature invalide sans votre authentification
Aucune preuve d’intégritéModification du commit = signature cassée
Historique falsifiableChaîne de confiance auditable

Prérequis

Avant de commencer, assurez-vous d’avoir :

  • Git 2.34+ (pour le support du format de signature x509)
  • Un compte OIDC : GitHub, Google, ou Microsoft
  • Connexion Internet (nécessaire pour l’authentification et Rekor)

Pour vérifier votre version de Git :

Terminal window
git --version
# Doit afficher 2.34 ou supérieur

GitSign vs GPG vs SSH

Trois méthodes existent pour signer vos commits. Voici comment choisir :

CritèreGPGSSH (Git 2.34+)GitSign
Gestion de clésClé longue durée à protégerClé SSH existanteAucune (OIDC)
RotationManuelle, complexeManuelleAutomatique (certificat éphémère)
VérificationWeb of trust ou clé uploadéeClé uploadée sur forgeLog de transparence Rekor
Badge “Verified”✅ GitHub/GitLab natif✅ GitHub/GitLab natif❌ Vérification CI requise
Air-gapped✅ Compatible✅ Compatible❌ Internet requis
AuditabilitéLimitéeLimitéeTotale (Rekor public)

Installation

Terminal window
# Avec Homebrew
brew install sigstore/tap/GitSign
# Vérifier l'installation
GitSign version

Configuration

Vous pouvez configurer GitSign globalement (tous vos projets) ou par projet.

Configuration globale (recommandée pour démarrer)

Ces commandes configurent Git pour utiliser GitSign sur tous vos dépôts :

Terminal window
# Activer la signature automatique des commits
git config --global commit.gpgsign true
# Indiquer à Git d'utiliser le format x509 (requis pour GitSign)
git config --global gpg.format x509
# Spécifier GitSign comme programme de signature
git config --global gpg.x509.program GitSign

Pourquoi ces trois lignes ?

  • commit.gpgsign true : Git signera automatiquement chaque commit
  • gpg.format x509 : utilise des certificats X.509 au lieu de GPG
  • gpg.x509.program GitSign : délègue la signature à GitSign

Configuration par projet

Si vous ne voulez utiliser GitSign que sur certains projets :

Terminal window
# Dans le répertoire du projet
cd mon-projet
git config --local commit.gpgsign true
git config --local gpg.format x509
git config --local gpg.x509.program GitSign

Vérifier la configuration

Terminal window
git config --list | grep -E "(commit.gpgsign|gpg.format|gpg.x509)"

Sortie attendue :

commit.gpgsign=true
gpg.format=x509
gpg.x509.program=GitSign

Premier commit signé

C’est le moment de tester ! Voici ce qui va se passer lors de votre premier commit signé.

  1. Créer ou modifier un fichier

    Terminal window
    echo "# Mon projet" > README.md
    git add README.md
  2. Faire un commit

    Terminal window
    git commit -m "feat: initialisation du projet"

    Comme commit.gpgsign est activé, Git appelle automatiquement GitSign.

  3. S’authentifier via OIDC

    Un navigateur s’ouvre avec une page Sigstore. Choisissez votre provider (GitHub, Google, Microsoft) et connectez-vous.

  4. Vérifier la signature

    Terminal window
    git log --show-signature -1

    Sortie attendue :

    commit abc123... (HEAD -> main)
    tlog index: 12345678
    GitSign: Signature made using certificate ID 0xabc...
    GitSign: Good signature from "votre-email@example.com"

Vérification des signatures

Vérifier en ligne de commande

Terminal window
# Vérifier le dernier commit
GitSign verify HEAD
# Vérifier une plage de commits
GitSign verify HEAD~5..HEAD
# Vérifier avec plus de détails
GitSign verify --verbose HEAD

Sortie d’une vérification réussie :

tlog index: 12345678
GitSign: Signature verified OK
GitSign: Certificate subject: votre-email@example.com
GitSign: Certificate issuer: https://github.com/login/oauth

Vérifier l’entrée dans Rekor

Chaque signature est enregistrée dans le log de transparence public. Pour retrouver une entrée :

Terminal window
# Rechercher par email
rekor-cli search --email votre@email.com
# Voir les détails d'une entrée
rekor-cli get --uuid <entry-uuid>

Vous pouvez aussi explorer Rekor via l’interface web : search.sigstore.dev

Intégration GitHub

GitHub ne reconnaît pas encore nativement les signatures GitSign. Vos commits n’auront pas le badge “Verified” automatiquement.

Solutions :

  1. Vérification CI : ajoutez un job qui vérifie les signatures (voir section GitHub Actions)
  2. Documentation : indiquez dans votre README que les commits sont vérifiables via GitSign verify

Intégration GitLab

Même situation que GitHub. Créez un job CI pour la vérification :

.gitlab-ci.yml
verify-signatures:
image: ghcr.io/sigstore/GitSign:latest
script:
- GitSign verify $CI_COMMIT_SHA
rules:
- if: $CI_PIPELINE_SOURCE == "push"

Configuration avancée

Choisir le provider OIDC

Par défaut, GitSign propose tous les providers. Pour forcer un provider spécifique :

Terminal window
# Utiliser GitHub uniquement
export GitSign_CONNECTOR_ID=https://github.com/login/oauth
# Utiliser Google uniquement
export GitSign_CONNECTOR_ID=https://accounts.google.com
# Utiliser Microsoft (Azure AD)
export GitSign_CONNECTOR_ID=https://login.microsoftonline.com

Pour rendre permanent, ajoutez à votre ~/.bashrc ou ~/.zshrc.

Signer des tags

GitSign fonctionne aussi pour les tags annotés :

Terminal window
# Créer un tag signé
git tag -s v1.0.0 -m "Release 1.0.0"
# Vérifier le tag
GitSign verify v1.0.0

Mode non-interactif (CI/CD)

Dans un pipeline CI, il n’y a pas de navigateur pour l’authentification OIDC. Utilisez un token OIDC fourni par la plateforme.

GitHub Actions :

name: Signed Commits
on: [push]
jobs:
verify:
runs-on: ubuntu-24.04
permissions:
id-token: write # Nécessaire pour obtenir un token OIDC
contents: read
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Historique complet pour vérification
- name: Install GitSign
run: |
GitSign_VERSION=$(curl -s https://api.github.com/repos/sigstore/GitSign/releases/latest | grep tag_name | cut -d '"' -f 4)
curl -LO "https://github.com/sigstore/GitSign/releases/download/${GitSign_VERSION}/GitSign_${GitSign_VERSION#v}_linux_amd64"
chmod +x GitSign_*_linux_amd64
sudo mv GitSign_*_linux_amd64 /usr/local/bin/GitSign
- name: Verify commit signatures
run: GitSign verify HEAD

GitLab CI avec OIDC :

verify-signatures:
image: ubuntu:latest
id_tokens:
SIGSTORE_ID_TOKEN:
aud: sigstore
script:
- |
GitSign_VERSION=$(curl -s https://api.github.com/repos/sigstore/GitSign/releases/latest | grep tag_name | cut -d '"' -f 4)
curl -LO "https://github.com/sigstore/GitSign/releases/download/${GitSign_VERSION}/GitSign_${GitSign_VERSION#v}_linux_amd64"
chmod +x GitSign_*_linux_amd64 && mv GitSign_*_linux_amd64 /usr/local/bin/GitSign
- GitSign verify $CI_COMMIT_SHA

Sécurité et vie privée

Ce qui est public

Ce qui est protégé

  • Votre clé privée n’existe pas : le certificat est éphémère
  • Vos credentials OIDC ne sont jamais stockés par GitSign
  • La signature prouve l’authenticité au moment de la création

Bonnes pratiques

PratiquePourquoi
Utilisez un compte dédié au codeSépare identité pro/perso
Activez 2FA sur le provider OIDCProtège contre le vol de compte
Vérifiez les signatures en CIDétecte les commits non signés
Documentez votre politiqueLes contributeurs savent quoi faire

Dépannage

Problèmes courants

SymptômeCause probableSolution
Navigateur ne s’ouvre pasxdg-open manquant ou WSLInstaller xdg-utils ou configurer BROWSER
error: gpg failed to signFormat x509 non configuréVérifier git config gpg.format
certificate has expiredCommit après expiration du certRefaire le commit (certificat = 10 min)
could not find tlog entryProblème réseau avec RekorVérifier connexion Internet
unsupported signature typeGit < 2.34Mettre à jour Git

Logs de débogage

Pour voir ce que fait GitSign en détail :

Terminal window
export GitSign_LOG=debug
git commit -m "test"

Réinitialiser la configuration

Si vous voulez revenir à GPG ou désactiver la signature :

Terminal window
# Désactiver la signature automatique
git config --global --unset commit.gpgsign
# Revenir au format GPG
git config --global gpg.format openpgp
git config --global --unset gpg.x509.program

Limites connues

LimitationDétailAlternative
Internet requisFulcio + Rekor nécessairesGPG/SSH pour air-gapped
Pas de badge GitHubVérification manuelleJob CI + badge personnalisé
Email publicVisible dans RekorGPG avec pseudonyme
Certificat court10 minutes de validitéPas de problème si commit immédiat

À retenir

  1. GitSign = signature keyless : votre identité OIDC remplace les clés GPG
  2. Certificat éphémère : valide ~10 minutes, mais signature vérifiable indéfiniment grâce à Rekor
  3. Transparence totale : toutes les signatures sont dans un log public
  4. Vérification CI : pas de badge GitHub natif, mais vérifiable par GitSign verify
  5. Email public : attention si anonymat requis

Liens utiles

Ressources externes