Aller au contenu
Sécurité medium

GitSign : signer vos commits Git avec Sigstore

20 min de lecture

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é.

  • Comprendre la signature keyless : certificat éphémère Fulcio, preuve Rekor
  • Installer Gitsign avec vérification de la somme de contrôle publiée
  • Configurer Git pour signer avec le format x509 au lieu d'OpenPGP
  • Vérifier une signature avec l'identité et l'émetteur OIDC attendus
  • Arbitrer entre Gitsign, GPG et SSH selon votre contexte (badge, air-gap, audit)

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.

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

Avant de commencer, assurez-vous d'avoir :

  • Git 2.19+ : c'est la version qui a introduit gpg.format = x509 et gpg.x509.program, les deux réglages sur lesquels Gitsign se branche
  • Un compte OIDC : GitHub, Google, ou Microsoft
  • Connexion Internet (nécessaire pour l'authentification et Rekor)

Pour vérifier votre version de Git :

Fenêtre de terminal
git --version
# Doit afficher 2.19 ou supérieur

Toutes les distributions maintenues livrent aujourd'hui une version très supérieure à ce plancher, la vérification sert surtout sur un serveur ancien ou une image de build figée.

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"Oui, GitHub/GitLab natifOui, GitHub/GitLab natifNon, vérification CI requise
Air-gappedCompatibleCompatibleInternet requis
AuditabilitéLimitéeLimitéeTotale (Rekor public)

La colonne SSH porte la mention « Git 2.34+ » parce que c'est la version qui a ajouté la valeur ssh à gpg.format. Le format x509 utilisé par Gitsign est disponible depuis Git 2.19, les deux plancher de version ne se confondent pas.

Gitsign est distribué en binaire statique, en paquet .deb/.rpm/.apk, et dans plusieurs gestionnaires de paquets. Sur Linux, préférez le paquet ou le binaire accompagné de sa vérification de somme de contrôle : le projet publie un fichier checksums.txt à chaque release, c'est lui qui prouve que l'archive téléchargée est bien celle publiée par les mainteneurs.

Fenêtre de terminal
# Avec Homebrew (formule officielle, dans homebrew-core)
brew install gitsign
# Vérifier l'installation
gitsign version

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

Configuration globale (recommandée pour démarrer)

Section intitulée « Configuration globale (recommandée pour démarrer) »

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

Fenêtre de terminal
# 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

Si vous ne voulez utiliser Gitsign que sur certains projets :

Fenêtre de terminal
# 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
Fenêtre de terminal
git config --list | grep -E "(commit.gpgsign|gpg.format|gpg.x509)"

Sortie attendue :

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

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

    Fenêtre de terminal
    echo "# Mon projet" > README.md
    git add README.md
  2. Faire un commit

    Fenêtre de terminal
    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

    Fenêtre de terminal
    git log --show-signature -1

    Sortie attendue :

    tlog index: 16072348
    gitsign: Signature made using certificate ID 0xa6c178d9292f70eb5c4ad9e274ead0158e75e484 | CN=sigstore-intermediate,O=sigstore.dev
    gitsign: Good signature from [vous@example.org](https://accounts.google.com)
    Validated Git signature: true
    Validated Rekor entry: true
    Validated Certificate claims: false
    commit abc123... (HEAD -> main)

    La dernière ligne de validation est à false volontairement : git log ne transmet aucune identité attendue au programme de signature, il ne peut donc pas contrôler qui a signé. C'est le rôle de gitsign verify.

Une signature Gitsign valide prouve deux choses distinctes : que le commit n'a pas été modifié, et que l'identité inscrite dans le certificat est bien celle que vous attendiez. Le second contrôle n'a lieu que si vous passez l'identité et l'émetteur OIDC attendus, sinon gitsign valide la cryptographie sans vérifier au nom de qui elle a été produite.

Fenêtre de terminal
# Vérifier le dernier commit en exigeant une identité et un émetteur précis
gitsign verify \
--certificate-identity=vous@example.org \
--certificate-oidc-issuer=https://accounts.google.com \
HEAD
# Une expression régulière quand plusieurs identités sont acceptables
gitsign verify \
--certificate-identity-regexp='.*@example\.org$' \
--certificate-oidc-issuer=https://accounts.google.com \
HEAD

Sortie d'une vérification réussie :

tlog index: 16072348
gitsign: Signature made using certificate ID 0xa6c178d9292f70eb5c4ad9e274ead0158e75e484 | CN=sigstore-intermediate,O=sigstore.dev
gitsign: Good signature from [vous@example.org](https://accounts.google.com)
Validated Git signature: true
Validated Rekor entry: true
Validated Certificate claims: true

Chaque signature est enregistrée dans le log de transparence public. Cette étape sert quand la vérification locale échoue et que vous cherchez à savoir si l'entrée existe réellement côté log, ou quand vous auditez a posteriori ce qu'un compte a signé.

Fenêtre de terminal
# Rechercher par email
rekor-cli search --email vous@example.org
# 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

GitHub ne reconnaît pas 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

Même situation que GitHub : le badge natif ne couvre pas Sigstore. Un job CI prend le relais et fait échouer le pipeline si la signature ne correspond pas à l'identité attendue. L'image officielle est épinglée par digest pour que le job exécute demain exactement le même binaire qu'aujourd'hui.

.gitlab-ci.yml
verify-signatures:
image: ghcr.io/sigstore/gitsign@sha256:052e78ddafc32fe9da4de01e06ff1e41efb1e94c852a10da14f00e5686a5ea5b # v0.16.1
script:
- gitsign verify
--certificate-identity=vous@example.org
--certificate-oidc-issuer=https://accounts.google.com
"$CI_COMMIT_SHA"
rules:
- if: $CI_PIPELINE_SOURCE == "push"

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

Fenêtre de terminal
# 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. Chaque variable GITSIGN_* a un équivalent SIGSTORE_* ; quand les deux sont définies, c'est le préfixe GITSIGN_ qui l'emporte.

Gitsign fonctionne aussi pour les tags annotés. Attention, la vérification passe par une sous-commande dédiée : gitsign verify ne sait lire que des objets commit.

Fenêtre de terminal
# Créer un tag signé
git tag -s v1.0.0 -m "Release 1.0.0"
# Vérifier le tag
gitsign verify-tag \
--certificate-identity=vous@example.org \
--certificate-oidc-issuer=https://accounts.google.com \
v1.0.0

Dans un pipeline CI, il n'y a pas de navigateur pour l'authentification OIDC. Le runner obtient un token OIDC de la plateforme, et Gitsign le consomme via GITSIGN_TOKEN_PROVIDER=github-actions. Pour la vérification seule, comme dans l'exemple ci-dessous, aucun token n'est nécessaire : on lit une signature existante.

GitHub Actions :

name: Signed Commits
on: [push]
# Aucun droit par défaut, chaque job demande le strict nécessaire
permissions: {}
jobs:
verify:
runs-on: ubuntu-24.04
timeout-minutes: 10
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0 # Historique complet pour la vérification
persist-credentials: false
- name: Install gitsign
env:
GITSIGN_VERSION: "0.16.1"
run: |
set -euo pipefail
base="https://github.com/sigstore/gitsign/releases/download/v${GITSIGN_VERSION}"
curl -sSLO "${base}/gitsign_${GITSIGN_VERSION}_linux_amd64"
curl -sSLO "${base}/checksums.txt"
grep " gitsign_${GITSIGN_VERSION}_linux_amd64$" checksums.txt | sha256sum --check
chmod +x "gitsign_${GITSIGN_VERSION}_linux_amd64"
sudo mv "gitsign_${GITSIGN_VERSION}_linux_amd64" /usr/local/bin/gitsign
- name: Verify commit signature
run: |
gitsign verify \
--certificate-identity-regexp='.*@example\.org$' \
--certificate-oidc-issuer=https://accounts.google.com \
HEAD

GitLab CI avec OIDC : l'image officielle embarque déjà le binaire, il n'y a donc rien à télécharger. Le bloc id_tokens sert dès que le job signe des objets ; pour une simple vérification il peut être retiré.

verify-signatures:
image: ghcr.io/sigstore/gitsign@sha256:052e78ddafc32fe9da4de01e06ff1e41efb1e94c852a10da14f00e5686a5ea5b # v0.16.1
id_tokens:
SIGSTORE_ID_TOKEN:
aud: sigstore
script:
- gitsign verify
--certificate-identity=vous@example.org
--certificate-oidc-issuer=https://accounts.google.com
"$CI_COMMIT_SHA"

Le modèle keyless déplace le risque plutôt qu'il ne le supprime : il n'y a plus de clé privée longue durée à voler sur votre poste, mais votre compte OIDC devient la cible. Trois garanties tiennent, à condition que ce compte reste sous votre contrôle.

  • Votre clé privée n'existe pas durablement : 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, grâce à l'horodatage inscrit dans Rekor

Ces quatre réflexes traitent le point faible réel du modèle : quiconque prend la main sur votre compte OIDC peut signer à votre place, et le log de transparence enregistrera cette signature comme légitime. Les deux premières lignes réduisent cette surface, les deux dernières permettent de détecter une dérive.

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

La quasi-totalité des échecs relèvent de trois familles : le navigateur qui ne s'ouvre pas, la configuration Git incomplète, ou le réseau qui coupe l'accès à Fulcio et Rekor. Repérez d'abord à quelle famille appartient votre message d'erreur, la colonne « Cause probable » vous y aide.

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.19, ou commit signé avec OpenPGPMettre à jour Git, ou vérifier avec gpg
Revision invalidUne plage (A..B) passée à gitsign verifyPasser une seule révision, boucler sur git rev-list

Git capture la sortie standard et la sortie d'erreur des programmes de signature : quand quelque chose échoue, vous ne voyez souvent rien d'utile. GITSIGN_LOG contourne ce masquage en écrivant l'état dans un fichier.

Fenêtre de terminal
export GITSIGN_LOG=/tmp/gitsign.log
git commit -m "test"
cat /tmp/gitsign.log

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

Fenêtre de terminal
# 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

Aucune de ces limites n'est un défaut d'implémentation : elles découlent toutes du choix keyless lui-même. Les connaître avant de standardiser Gitsign sur une équipe évite la mauvaise surprise du premier audit ou du premier déplacement hors ligne.

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
  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 utile = identité exigée : sans --certificate-identity (ou sa variante -regexp) et --certificate-oidc-issuer, vous validez la cryptographie sans contrôler qui a signé
  5. Email public : attention si anonymat requis
  6. Preuve attendue : un job CI qui exécute gitsign verify avec l'identité et l'émetteur attendus, et dont l'échec bloque la merge request

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn