Pourquoi signer ses commits ?
La signature des commits est une pratique de sécurité essentielle dans le monde du développement logiciel, en particulier dans des environnements collaboratifs comme GitHub. Elle sert à plusieurs objectifs clés :
- Authentification : Chaque commit signé porte une empreinte digitale unique qui certifie que le commit a été effectué par le propriétaire de la clé de signature. Cela aide à éviter les usurpations d'identité et les contributions malveillantes.
- Intégrité : La signature garantit que le contenu du commit reste inchangé depuis sa création. Toute modification, même mineure, invaliderait la signature.
- Confiance : Dans le cadre de projets open source ou au sein de grandes équipes, la signature des commits renforce la confiance en assurant que les contributions émanent de sources vérifiées et fiables.
Qu'est-ce que GPG ?
GNU Privacy Guard (GPG), également connu sous le nom de GnuPG, est un outil de cryptographie qui permet de chiffrer et de signer des données et des communications. GPG utilise le standard OpenPGP pour fournir un mécanisme de cryptage et de signature robuste.
- Fonctionnement de GPG : GPG crée une paire de clés (une clé publique et une clé privée). La clé privée est utilisée pour signer des commits, tandis que la clé publique est partagée avec d'autres (comme GitHub) pour vérifier ces signatures.
- Compatibilité : GPG est largement compatible avec différents systèmes d'exploitation et plateformes, ce qui en fait un outil de choix pour les développeurs travaillant dans divers environnements.
Dans les sections suivantes, nous allons vous guider à travers le processus d'installation de GPG, la création de votre paire de clés, et l'ajout de votre clé publique à GitHub pour commencer à signer vos commits.
Installer GPG
Pour commencer à utiliser GPG pour signer vos commits, la première étape est d'installer le logiciel sur votre système. Voici comment procéder selon votre système d'exploitation :
A. Windows
- Téléchargez Gpg4win : Gpg4win (GnuPG for Windows) est un ensemble complet pour la gestion de la cryptographie sous Windows. Il peut être téléchargé depuis le site officiel de Gpg4win.
- Installation : Exécutez le fichier d'installation téléchargé et suivez les instructions à l'écran. Assurez-vous d'inclure
Kleopatra
dans les composants à installer, car c'est un outil de gestion de clés pratique. - Vérification : Après l'installation, ouvrez l'invite de commande et tapez
gpg --version
pour vérifier que GPG est correctement installé.
B. macOS
- Utilisez Homebrew : Homebrew est un gestionnaire de paquets pour macOS. Si vous ne l'avez pas déjà installé, vous pouvez le faire en suivant les instructions sur le site de Homebrew.
- Installation de GPG : Ouvrez le Terminal et tapez
brew install gnupg
pour installer GPG. - Vérification : Après l'installation, tapez
gpg --version
dans le Terminal pour confirmer que GPG est installé.
C. Linux
- Installation via le gestionnaire de paquets : Sur la plupart des distributions Linux, GPG est disponible dans les dépôts officiels. Utilisez votre gestionnaire de paquets pour l'installer :
- Sur les distributions basées sur Debian/Ubuntu :
sudo apt-get install gnupg
- Sur les distributions basées sur Fedora :
sudo dnf install gnupg
- Sur les distributions basées sur Arch :
sudo pacman -S gnupg
- Sur les distributions basées sur Debian/Ubuntu :
- Vérification : Dans le terminal, tapez
gpg --version
pour vérifier que GPG a été installé avec succès.
D. Interactivité avec GPG depuis le Terminal
Configuration de GPG_TTY
pour une meilleure interaction :
Lorsque vous utilisez GPG dans le terminal, il est recommandé d'ajouter la configuration suivante à la fin de votre fichier d'initialisation de shell
export GPG_TTY=$(tty)
Cette configuration garantit que GPG peut interagir correctement avec vous, notamment pour la saisie de la passphrase.
Pour savoir quel shell, vous pouvez utiliser la commande echo $SHELL
- Pour
zsh
: ajouter la ligne dans~/.zshrc
- Pour
bash
: ajouter la ligne dans~/.bashrc
- Si vous utilisez un autre shell, référez-vous à sa documentation et modifiez le fichier correspondant.
Après avoir ajouté la ligne, sauvegardez le fichier et rechargez-le en exécutant source ~/.zshrc
ou source ~/.bashrc
, ou autre selon votre shell.
Générer sa clé GPG avec le terminal
Après avoir installé GPG, l'étape suivante est de générer votre paire de clés (publique et privée). Suivez ces étapes pour créer votre clé GPG :
A. Lancement du processus de génération de clé
- Ouvrir le terminal : Commencez par ouvrir votre terminal ou invite de commande.
- Commande de génération de clé : Tapez
gpg --full-generate-key
et appuyez sur Entrée. Cette commande lance l'assistant de création de clé.
gpg --full-generate-key
gpg ≥ 2.1.17
pour utiliser l'option --full-generate-key
B. Sélection du type de clé
- Choix du type de clé : GPG vous demandera de choisir le type de clé. Pour la plupart des utilisateurs, l'option par défaut (RSA and RSA) est appropriée. Appuyez sur Entrée pour continuer.
- Taille de la clé : Choisissez une taille de clé. Pour une sécurité optimale, il est recommandé de choisir au moins 2048 bits, mais 4096 bits est l'idéal si vous recherchez une sécurité accrue.
C. Choix de la durée de validité de la clé
- Définir l'expiration : GPG vous demandera ensuite combien de temps la clé doit rester valide. Une option commune est de définir une période d'expiration (comme 1 ou 2 ans) ou vous pouvez choisir que la clé ne expire jamais.
- Confirmer le choix : Après avoir fait votre choix, confirmez-le et continuez.
D. Ajout de renseignements personnels
- Identité de l'utilisateur : GPG vous demandera de saisir votre nom, votre adresse e-mail (celle associée à votre compte GitHub ou GitLab) et éventuellement un commentaire. Ces informations seront associées à votre clé publique. Dans le cas de GitHub ou GitLab, pour garder son adresse email privée, vous pouvez utiliser l’adresse no-reply de votre compte.
- Création de la phrase secrète : Vous serez invité à créer une phrase secrète pour protéger votre clé privée. Choisissez une phrase secrète forte et mémorable.
Le choix de l'email de la clé GPG doit respecter plusieurs critères :
1. Un email valide du compte GitHub/GitLab
2. Identique à l'adresse email utilisée pour la création du commit
Cela a 2 avantages
1) garder votre adresse privée lorsque vous commitez sur des repos (public ou non)
2) dans le cas de la révocation de votre clé GPG, vous pourrez la diffuser sur des serveurs publics sans donner votre email d'usage
E. Finalisation et vérification
- Achever la génération : Une fois toutes les informations saisies, GPG générera votre paire de clés. Cela peut prendre quelques instants, surtout si vous avez choisi une grande taille de clé.
- Lister vos clés : Pour voir vos clés GPG générées, tapez
gpg --list-secret-keys --keyid-format LONG
. Notez l'identifiant de la clé (situé après "sec rsa4096/" par exemple) car vous en aurez besoin pour la suite.
gpg --list-secret-keys --keyid-format LONG
sec <algo>/<keyid> <date>
où
<keyid>
est l'identifiant de la clef que l'on va avoir besoinConfigurer son environment local
A. Vérification de l'email utilisé pour la création de commit
Ouvrez votre terminal et tapez
git config --global user.email
Assurez-vous que cette adresse email est la même que celle enregistrée et validée sur votre compte GitHub/GitLab et celle utilisée pour générer votre clé GPG.
Changez l'email si nécessaire
1. Soit en régénérant une clef GPG avec l'adresse email correcte
2. Soit en changeant l'adresse email utilisée pour la création de commit avec la commande
git config --global user.email "votre-email@exemple.com"
--global
dans le répertoire du dépôt.B. Récupération de l'identifiant de votre clé GPG
C'est le <keyid>
évoqué à l'étape précédente. Pour rappel, lancer la commande
gpg --list-secret-keys --keyid-format LONG
La ligne suit généralement le format suivant :sec <algo>/<keyid> <date>
où <keyid>
est l'identifiant de la clef que l'on va avoir besoin.
C. Configuration de Git pour utiliser votre clé GPG
Utilisez la commande
git config --global user.signingkey <keyid>
en remplaçant le <keyid>
par l'identifiant de votre clef GPG. Vous pouvez vérifier sa valeur avec la commande git config --global user.signingkey
--global
dans le répertoire du dépôt.D. Activation de la signature automatique des commits
- Signature par défaut : Pour signer automatiquement tous vos commits, utilisez la commande
git config --global commit.gpgsign true
git config --global tag.gpgsign true
- Signature manuelle : Si vous préférez signer certains commits manuellement, vous pouvez omettre cette étape et utiliser l'option
-S
dans la commande de commit, par exemple
git commit -S -m "Votre message de commit"
E. Test de la configuration
- Commit de test : Pour tester si tout est configuré correctement, faites un commit test dans un de vos dépôts.
- Vérification de la signature : Utilisez
git log --show-signature
pour vérifier que le commit est signé.
Conserver un certificat de révocation
A. Importance du Certificat de Révocation
Un certificat de révocation est essentiel pour maintenir la sécurité de vos clés. En cas de compromission ou de perte de votre clé privée, le certificat de révocation vous permet de révoquer l'accès à votre clé publique.
B. Création et Sauvegarde
Par défaut, GPG crée un certificat de révocation lorsque vous générez une nouvelle clé. Vous pouvez trouver ce certificat à l'intérieur d'un fichier situé ici ~/.gnupg/openpgp-revocs.d/<keyfingerprint>.rev
, où <keyfingerprint>
est l'emprunte de votre clé. Vous pouvez la retrouver avec lors de l'utilisation de la commande gpg --list-secret-keys --keyid-format LONG
elle s'affiche en dessous de la ligne <algo>/<keyid> <date>
qui correspond à votre clé. Suivez les instructions dans le fichier <keyfingerprint>.rev
pour y extraire le certificat de révocation.
Vous pouvez aussi en générer un nouveau à l'aide de votre clé privé avec la commande:
gpg --output revoke.asc --gen-revoke <keyid>
où <keyid>
est l'identifiant de la clé GPG.
gpg --list-secret-keys --keyid-format LONG
La ligne suit généralement le format suivant :
sec <algo>/<keyid> <date>
où
<keyid>
est l'identifiant de la clé que l'on va avoir besoinConservez ce certificat dans un endroit sûr. En cas de besoin, vous pourrez l'utiliser pour révoquer votre clé publique et informer les plateformes et les collaborateurs que la clé n'est plus fiable.
Configurer la plateforme d'hébergement de code source (GitHub/GitLab)
A. Principe de base de la signature numérique
- Clé privée pour signer : Lorsque vous signez un commit, vous utilisez votre clé privée GPG. C'est une pratique sécurisée car votre clé privée est protégée par une passphrase que vous avez définie lors de sa génération. Cette signature garantit que le commit provient de vous et n'a pas été altéré.
- Clé publique pour vérifier : Pour qu'un tiers (comme GitHub ou GitLab) puisse vérifier la signature de vos commits, vous devez leur fournir votre clé publique. Cette clé permet de vérifier que la signature correspond à la clé privée sans divulguer les informations sensibles de la clé privée.
B. Importance de la sécurisation de la clé privée
- Gardez votre clé privée sécurisée : Il est crucial de garder votre clé privée en sécurité et de ne jamais la partager. La passphrase ajoutée à votre clé lors de la génération est une couche de sécurité supplémentaire.
- Risques liés à la compromission : Si votre clé privée est compromise, cela pourrait remettre en cause l'authenticité de vos contributions. En cas de compromission, il est nécessaire de révoquer la clé et d'en générer une nouvelle. Ceci fera l'objet d'une autre partie.
C. Exporter sa clé publique
Après avoir généré votre paire de clés GPG, vous devrez exporter votre clé publique pour l'ajouter à votre plateforme d'hébergement de code source. Voici comment procéder :
Ouvrez votre terminal et lancer la commande :
gpg --armor --export <keyid>
où <keyid>
est l'identifiant de la clé GPG.
gpg --list-secret-keys --keyid-format LONG
La ligne suit généralement le format suivant :
sec <algo>/<keyid> <date>
où
<keyid>
est l'identifiant de la clé que l'on va avoir besoinL'exportation affichera votre clé publique dans le terminal sous forme de texte. Sélectionnez et copiez cette clé en entier, y compris les lignes -----BEGIN PGP PUBLIC KEY BLOCK-----
et -----END PGP PUBLIC KEY BLOCK-----
.
GitHub
Configuration de GitHub
A. Signification du Badge Verified
- Authenticité et Intégrité : Le badge
Verified
sur un commit indique que GitHub a validé la signature numérique associée à ce commit. Cela prouve que le commit a été effectué par le détenteur de la clé privée correspondant à la clé publique enregistrée, et que le contenu du commit n'a pas été modifié depuis sa signature. - Confiance et Professionnalisme : Ce badge renforce la confiance dans la qualité et la sécurité du code. Il montre également un niveau de professionnalisme dans la gestion de l'intégrité et la sécurisation des contributions.
- Mise en évidence : Le badge apparaît à côté du nom de l'auteur du commit, le rendant immédiatement visible et facilement identifiable pour les autres utilisateurs et contributeurs.
B. Ajout de la Clé Publique à GitHub
- Accès aux Paramètres : Connectez-vous à GitHub, puis accédez à vos paramètres de compte "Settings".
- Gestion des Clés GPG : Naviguez vers la section "SSH and GPG keys" et cliquez sur "New GPG key".
- Coller la Clé Publique : Collez votre clé publique GPG, récupérée dans la section précédente, dans le champ de texte fourni. Vous pouvez optionnellement donner un nom à votre clé.
gpg --armor --export <keyid>
- Enregistrer la Clé : Cliquez sur "Add GPG key" pour ajouter la clé à votre compte.
C. Vérification du badge
Poussez votre commit sur GitHub et vérifiez que tout est en ordre
🎉 Félicitations 🎉 vos commits signés sont maintenant reconnus sur GitHub !
Si vous supprimez votre clé publique GPG de GitHub, tous les anciens commits signés avec la clé privée correspondante seront marqués comme
Unverified
. Cela peut affecter la perception de l'intégrité et de l'authenticité de vos contributions passées. Pour faire cela proprement en conservant la mention verified
vous pouvez suivre la procédure de la partie "Révoquer une clé GPG, faire une Rotation" GitLab
Configuration de GitLab
A. Signification du Badge Vérifiée
- Validation de la Signature : Tout comme sur GitHub, le badge "Vérifiée" sur un commit dans GitLab indique que la plateforme a validé la signature numérique associée à ce commit.
- Garantie de l'Origine : Ce badge certifie que le commit a été réalisé par le détenteur de la clé privée correspondant à la clé publique enregistrée, assurant ainsi que le contenu du commit n'a pas été altéré.
- Renforcement de la Confiance : La présence de ce badge renforce la confiance dans l'intégrité et la sécurité des contributions au sein d'un projet.
B. Ajouter la Clé Publique à GitLab
- Paramètres de Compte : Connectez-vous à GitLab et accédez à vos paramètres de compte.
- Gestion des Clés GPG : Naviguez vers la section "Clés GPG" dans les paramètres utilisateur.
- Coller la Clé Publique : Collez votre clé publique GPG, récupérée dans la section précédente, dans le champ de texte fourni.
gpg --armor --export <keyid>
- Enregistrer la Clé : Cliquez sur "Ajouter une clé" pour ajouter la clé à votre compte.
C. Vérification du badge
Poussez votre commit sur GitLab et vérifiez que tout est en ordre
🎉 Félicitations 🎉 vos commits signés sont maintenant reconnus sur GitLab !
Ajout de la clé sur le compte avant le push : si vous poussez un commit signé avant d'avoir ajouté la clé correspondante à votre compte, le commit apparaîtra comme "non vérifiée", même s'il a été correctement signé avec la bonne clé privée.
Révoquer une clé GPG, faire une Rotation
A. Pourquoi et Quand Révoquer une Clé ?
- Sécurité : Si vous pensez que votre clé privée a été compromise ou si vous avez oublié votre passphrase, la révocation d'une clé est nécessaire !
- Changement : Vous pouvez également vouloir révoquer une clé si vous changez d'adresse email ou si vous créez une clé plus forte.
B. Création d'un Certificat de Révocation
Si vous avez suivi cet article jusqu'ici, vous avez déjà à disposition votre certificat de révocation. Si ce n'est pas le cas, vous pouvez toujours vous référez à la section "Conserver un certificat de révocation".
gpg --output revoke.asc --gen-revoke <keyid>
vous pourrez ainsi fournir la raison de la révocation.Partons donc du postulat que vous avez maintenant votre certificat de révocation dans le fichier revoke.asc
C. Révocation de la clé publique
Importez votre certificat dans votre trousseau avec la commande:
gpg --import revoke.asc
gpg --list-secret-keys --keyid-format LONG
vous pouvez constater que votre clé est bien révoquée dans votre trousseau.Votre clef est maintenant localement révoquée. Vous pouvez ensuite exporter la clef publique révoquée avec la commande :
gpg --armor --export <keyid>
Et la renseigner sur GitHub / GitLab à la place de l'ancienne clé publique. Vous conserverez alors le statut Verified
sur vos commits précédemment signé la clé privée.
D. Diffusion de la clé publique révoquée sur un serveur public
Après avoir révoqué votre clé GPG, il est important de s'assurer que la révocation est reconnue publiquement. Cela se fait en diffusant la clé révoquée sur un serveur de clés public.
Lorsque vous diffusez votre clé publique sur un serveur de clés public, gardez à l'esprit que votre adresse email associée à la clé est généralement visible publiquement.
Elle peut donc être la cible de spams, ce qui pose des risques de sécurité et de confidentialité. Pour éviter cela l'utilisation d'une adresse email no-reply, comme celles fournies par GitHub/GitLab, est une mesure de sécurité recommandée.
- Pourquoi Diffuser la Révocation ?
- Transparence : La diffusion de la révocation informe la communauté et les collaborateurs que la clé n'est plus sûre ou valide.
- Prévention : Cela empêche l'utilisation future de la clé pour la vérification des signatures, protégeant ainsi l'intégrité de vos projets.
- Choisir un Serveur de Clés Public
- Serveurs Populaires : Des serveurs comme le serveur de clés SKS, le serveur de clés MIT, ou le serveur de clés OpenPGP sont des choix courants.
- Compatibilité : Assurez-vous que le serveur que vous choisissez est compatible avec les plateformes où votre clé a été utilisée (par exemple, GitHub ou GitLab).
On peut par exemple utiliser keys.openpgp.org ou keyserver.ubuntu.com. Vous pouvez le faire manuellement sur leur site ou utiliser la commande suivante :
gpg --keyserver keyserver.ubuntu.com --send-keys <keyid>
Vous pouvez a présent terminer par la création d'une nouvelle clé en reprenant les étapes des sections précédentes.
Bonus
Configuration du Cache du GPG Agent
Pour une meilleure gestion de la saisie de votre passphrase GPG, vous pouvez configurer le cache du GPG agent. Cela vous permet de définir pendant combien de temps la passphrase reste en mémoire après l'avoir saisie, réduisant ainsi la fréquence à laquelle vous devez la rentrer.
Le fichier de configuration se trouve généralement dans ~/.gnupg/gpg-agent.conf
. Si le fichier n'existe pas, vous pouvez le créer.
- Configurer le Temps de Cache par Défaut : Vous pouvez définir la durée pendant laquelle GPG garde en cache la passphrase après une activité GPG. Par exemple :
# Set the default cache time to 1 day.
default-cache-ttl 86400
Cela configure le cache pour garder la passphrase pendant 1 jour (86400 secondes).
- Configurer le Temps de Cache Maximum : Vous pouvez également définir une durée maximale de mise en cache après avoir entré votre passphrase :
# Set the max cache time to 30 days.
max-cache-ttl 2592000
Cela signifie que la passphrase sera mémorisée pendant 30 jours maximum (2592000 secondes).
Redémarrez le GPG Agent
Pour que les modifications prennent effet, redémarrez le GPG agent avec la commande :
gpgconf --reload gpg-agent
Vous pouvez aussi utilisez la commande gpgconf --kill gpg-agent