Configuration Git avec signature de commits par clé ssh

Guide de configuration Git avec Home Manager et signature SSH des commits sur NixOS et Forgejo

Introduction

La signature de commits Git est devenue une pratique essentielle pour garantir l'authenticité du code source. Avec NixOS et Home Manager, cette configuration devient déclarative, reproductible et élégante. Cet article détaille comment configurer Git avec la signature SSH ED25519, à la place de gpg, particulièrement adaptée aux forges auto-hébergées comme Forgejo ou Gitea. Github et gitlab intègre l'affichage du controle de signature.

Pourquoi signer ses commits ?

La signature de commits offre plusieurs avantages :

  • Authenticité : garantit que c'est bien vous qui avez créé le commit
  • Traçabilité : essentiel pour les projets sensibles ou collaboratifs
  • Badge vérifié : sur Forgejo/Gitea, vos commits affichent un badge de vérification

Avec SSH, vous réutilisez vos clés existantes sans la complexité de GPG. L'apport principal de GPG étant la durée de vie des clés et la révocation, à vous de mesurer votre besoins.

A ce jour, je ne travail pas dans un contexte ou j'ai besoins des fonctionnalités de GPG, j'ai donc opté pour SSH, mais ce contexte pourrait changer dans un futur plus ou moins proche. Le changement pour GPG sera simple.

Configuration déclarative avec Home Manager

Structure du module home-manager

Le fichier git.nix configure Git de manière déclarative. Voici la configuration complète :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{ config, pkgs, ... }:
{
  home.file.".ssh/allowed_signers".text =
    "* ${builtins.readFile /home/alexandre/.ssh/id_ed25519-2025.pub}";
  
  programs.git = {
    enable = true;
    settings = {
      # Configuration utilisateur
      user = {
        name = "Alexandre LUCAZEAU";
        email = "lucazeau.alexandre@gmail.com";
        signingkey = "~/.ssh/id_ed25519-2025.pub";
      };
      
      # Activation de la signature
      commit = {
        gpgsign = true;
      };
      
      # Configuration SSH pour la signature
      gpg = {
        format = "ssh";
        ssh.allowedSignersFile = "~/.ssh/allowed_signers";
      };
      
      # Autres paramètres utiles
      init = {
        defaultBranch = "main";
      };
      
      core = {
        pager = "delta";
      };
    };
  };
}

J'utilise delta comme pager à la place de less. Je le trouve plus lisible dans les diffs avec de la coloration et l'affichage des numéros de lignes.

Points clés de la configuration

Fichier allowed_signers

Le fichier ~/.ssh/allowed_signers est crucial pour la vérification locale des signatures :

1
* ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... lucazeau.alexandre@gmail.com

Home-Manager génère automatiquement ce fichier en lisant votre clé publique. Le format est simple : un motif (ici * pour tout email) suivi de la clé publique.

Activation de la signature automatique

Le paramètre commit.gpgsign = true signe automatiquement tous vos commits sans avoir à ajouter -S à chaque fois.

Format SSH au lieu de GPG

L'option gpg.format = "ssh" indique à Git d'utiliser SSH au lieu du traditionnel GPG, simplifiant drastiquement la configuration.

Génération de la clé SSH

Si vous n'avez pas encore de clé ED25519 :

1
2
3
4
5
6
# Générer une nouvelle clé
ssh-keygen -t ed25519 -C "lucazeau.alexandre@gmail.com" \
  -f ~/.ssh/id_ed25519-2025

# Ajouter au ssh-agent
ssh-add ~/.ssh/id_ed25519-2025

La clé publique se trouve dans ~/.ssh/id_ed25519-2025.pub.

Configuration sur Forgejo/Gitea

Ajout de la clé de signature

  1. Connectez-vous à votre instance Forgejo
  2. Accédez à ParamètresClés SSH / GPG
  3. Dans la section Clés SSH, cliquez sur Ajouter une clé
  4. Important : cochez la case "Utiliser cette clé pour signer les commits"
  5. Collez le contenu de votre id_ed25519-2025.pub
  6. Donnez-lui un nom descriptif (ex: "NixOS Desktop 2025")

Vérification sur Forgejo

1
2
3
4
5
# Créer un commit signé
git commit -m "test: vérification signature SSH"

# Pousser vers Forgejo
git push origin main

Sur l'interface web de Forgejo, votre commit devrait maintenant afficher un badge Vérifié avec une coche verte.

Alias Git pratiques

La configuration inclut plusieurs alias qui améliorent le workflow :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
alias = {
  # Commits rapides
  cim = "commit -m";
  cima = "commit -am";
  oups = "commit --amend --no-edit";
  
  # Gestion des branches
  nb = "checkout -b";
  bd = "branch -d";
  
  # Push sécurisé
  pushfl = "push --force-with-lease";
  
  # Statut compact
  st = "status -sb";
};

L'alias oups est particulièrement utile pour amender le dernier commit signé sans éditer le message.

Intégration avec Delta

La configuration utilise Delta comme pager pour des diffs plus lisibles :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
core = {
  pager = "delta";
};

interactive = {
  diffFilter = "delta --color-only --features=interactive";
};

delta = {
  navigate = true;
  line-numbers = true;
};

Delta nécessite d'être installé dans votre configuration NixOS :

1
2
3
home.packages = with pkgs; [
  delta
];

Vérification locale des signatures

Pour vérifier les signatures de commits localement :

1
2
3
4
5
# Voir les signatures dans le log
git log --show-signature

# Vérifier un commit spécifique
git verify-commit HEAD

La sortie devrait afficher :

Good "git" signature for lucazeau.alexandre@gmail.com with ED25519 key SHA256:...

Debugging et problèmes courants

Erreur "gpg failed to sign the data"

Vérifiez que :

  1. Le fichier allowed_signers existe et contient votre clé
  2. Le chemin vers signingkey est correct
  3. La clé privée est chargée dans le ssh-agent
1
2
3
4
5
# Vérifier le ssh-agent
ssh-add -l

# Recharger la clé si nécessaire
ssh-add ~/.ssh/id_ed25519-2025

La signature n'apparaît pas sur Forgejo

  1. Vérifiez que la clé SSH sur Forgejo a bien la case "signature" cochée
  2. L'email dans user.email doit correspondre à un email vérifié sur Forgejo
  3. Assurez-vous que la clé publique est exactement la même

Chemin relatif vs absolu

La configuration utilise ~/.ssh/... plutôt que des chemins absolus. Home Manager résout automatiquement ~ vers votre répertoire home.

Avantages de l'approche déclarative

Avec NixOS et Home-Manager :

  • Reproductibilité : même configuration sur toutes vos machines
  • Versionnage : votre config Git est dans votre dépôt dotfiles
  • Atomicité : activation/rollback instantané avec home-manager switch
  • Documentation : la config est auto-documentée en Nix

Migration depuis GPG

Si vous utilisiez GPG auparavant, la migration est simple :

1
2
3
4
5
6
7
8
9
# Commentez l'ancienne config GPG
#signing.key = "3C8ADB07A8217BD3";
#signing.signByDefault = false;

# La nouvelle config SSH prend le relais
gpg = {
  format = "ssh";
  ssh.allowedSignersFile = "~/.ssh/allowed_signers";
};

Aucun impact sur vos anciens commits signés avec GPG, ils restent valides.

Conclusion

La signature SSH de commits avec NixOS offre le meilleur des deux mondes : la simplicité de SSH et la puissance de la configuration déclarative.

Pour aller plus loin :

  • Activez la signature obligatoire sur vos dépôts Forgejo
  • Configurez des hooks pre-commit pour vérifier les signatures
  • Explorez git config --global tag.gpgSign true pour signer aussi les tags

Ressources

Configuration testée sur NixOS 25.11 avec Home-Manager et Forgejo 1.21

Généré avec Hugo
Thème Stack conçu par Jimmy